我有一个api,它使用springdatajpa/hibernate框架,使用hql调用我的数据库,它是aws上的postgresqldb示例。问题是,我的数据库在cst中,我们加载带有客户优惠券的cst时间戳的数据,并与之进行一些逻辑/比较,目的是所有数据都在cst中;但是,使用“current\u timestamp”函数的hql查询似乎返回utc时间戳,从而导致所有关系运算符语句(即。 customerCoupons.expiredDate >= CURRENT_TIMESTAMP
)将优惠券到期时间与当前时间戳进行比较是错误的。
查询如下所示:
@Query( value = SELECT customerCoupons FROM CustomerCouponsEntity AS customerCoupons "
WHERE customerCoupons.couponCode = :couponCode "
AND customerCoupons.expiredDate >= CURRENT_TIMESTAMP "
AND customerCoupons.startDate <= CURRENT TIME"
List<CustomerCouponsEntity> findByCouponCode(@Param("couponCode") String couponCode);
所以你可以看到我可以搜索一个“优惠券代码”,并找到所有优惠券的客户,没有过期。问题是我的数据库在中央时间(cst),然而,当我将这个spring引导应用程序部署到aws云测试api时,这些hql查询100%返回utc时间戳。更糟糕的是,当我和我的其他朋友在本地测试这个应用程序时,当前的时间戳似乎会返回用户所在的时区(即,如果我的朋友在东部时间下午6点运行这个应用程序,我们将过期时间设置为cst下午5点,因为hql查询将返回当前的\u timestamp==6pmest,而不是cst,所以对于他来说,它已经过期了,因为数据库在cst中。在本地运行时,cst或pst中的用户也会发生同样的行为。
我已经证明了这一点,因为我已经将“优惠券”注入到我的数据库中,其中包含中心时间(cst)过期日期,正如您在上面看到的,这个hql查询只返回我数据库中未过期的优惠券。然而,当我注入一个优惠券,使其在2021-02-25 22:00:00的时间戳过期时,也就是晚上10点,现在是晚上9点,我的api没有返回任何数据。但是,在9pm cst,如果我将这个10pm==22:00:00时间戳更改为utc时间(等于04:00:00 utc),我的api将返回数据,并且在到达04:0:00 utc或10pm cst时,它将返回0条记录。所以我知道,尽管我的数据库在aws中被配置为cst,但由于某种原因,这个hql函数正在返回utc时间。
有人能解释一下为什么会这样吗?我发现了另一个堆栈溢出帖子,其中用户声明“current\u timestamp”函数应该在SQLServer数据库上运行,即使是hql,但从我的观察来看,这并没有发生。hql当前的\u timestamp()是如何工作的?
此外,与其他不同时区的开发人员在本地测试了这个spring boot应用程序,我们看到带有“currrent\u timestamp”的hql查询看起来实际上取决于用户的本地时区;i、 e.设置为在est时间过期的记录,比如下午4点,仍然可以通过我的api(它使用这个hql查询来查询数据库)进行查询,即使我在est时区与另一个开发人员进行zoom调用,他得到了0条记录。因此,我99.9%确定这个hql“当前时间戳”由于某种原因依赖于系统本地时区。虽然,我知道数据库设置在aws到cst,但我相信系统日志记录是在utc,我不确定任何其他设置。。。。
我打算用这样的方法来解决这个问题:
CURRENT_TIMESTAMP at TIME ZONE 'America/Chicago'
它看起来在当地工作得很好;这是最好的解决方案吗?有人能解释我在hql hibernate sql查询中看到的带有当前时间戳的行为吗?
暂无答案!
目前还没有任何答案,快来回答吧!