首页 > 解决方案 > Hibernate "CURRENT_TIMESTAMP" HQL 查询返回 UTC 时间戳,即使 DB 在 CST 中

问题描述

我有一个 API,它使用 Spring 数据 JPA/Hibernate 框架,使用 HQL 来调用我的数据库,这是 AWS 上的 Postgresql 数据库实例。问题是我的数据库在 CST 中,我们加载了带有 CST 时间戳和客户优惠券的数据,我们对此进行了一些逻辑/比较,目的是让它们都在 CST 中;但是,使用“CURRENT_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 Boot 应用程序部署到 AWS 云测试我的 API 时,这些 HQL 查询 100% 返回 UTC 时间戳。更糟糕的是,当我和我的其他朋友在本地测试这个应用程序时,CURRENT_TIMESTAMP 似乎返回了用户所在的任何时区(即,如果我的朋友在下午 6 点在 EST 时区运行它并且我们将到期时间设置为下午 5 点 CST,它对他来说已经过期了,因为 HQL 查询将返回一个 CURRENT_TIMESTAMP == 6pm EST 而不是 CST,就像它应该的那样,因为数据库在 CST 中。在本地运行时,CST 或 PST 中的用户也会发生同样的行为)。

我已经证明了这一点,因为我已经将具有中央时间 (CST) 到期日期的“优惠券”注入到我的数据库中,并且正如您在上面看到的,这个 HQL 查询仅从我的数据库中返回未过期的优惠券。但是,当我注入说一张优惠券在 2021 年 2 月 25 日 22:00:00 的时间戳过期时,即晚上 10 点,目前是中央时间晚上 9 点,我的 API 没有返回任何数据。但是,在中部标准时间晚上 9 点,如果我将此 10PM == 22:00:00 时间戳更改为 UTC 时间,等于 UTC 时间 04:00:00,我的 API 会在到达04:0:00 UTC 时立即返回数据,或 10PM CST,则返回 0 条记录。所以我知道,尽管我的数据库在 AWS 中被配置为 CST,但由于某种原因,这个 HQL 函数正在返回 UTC 时间。

谁能向我解释这是为什么?我发现另一个堆栈溢出帖子,其中用户声明“CURRENT_TIMESTAMP”函数应该在 SQL Server 数据库上运行,即使是 HQL,但据我所知,这并没有发生。 HQL 的 current_timestamp() 是如何工作的?

此外,在不同时区与其他开发人员在本地测试了这个 Spring Boot 应用程序,我们看到带有“CURRRENT_TIMESTAMP”的 HQL 查询看起来实际上取决于用户本地时区;即设置为在 EST 时间到期的记录,比如下午 4 点,仍然 可以通过我的 API 查询(它使用这个 HQL 查询来查询数据库),即使我正在与 EST 时区的另一位开发人员进行缩放通话并且他是获得 0 条记录。所以我 99.9% 确定这个 HQL“CURRENT_TIMESTAMP”出于某种原因依赖于系统本地时区。虽然,我知道数据库在 AWS 中设置为 CST,但我相信系统日志记录是 UTC,我不确定任何其他设置....

我打算用这样的东西来解决这个问题:

CURRENT_TIMESTAMP at TIME ZONE 'America/Chicago'

它看起来在本地工作得很好;这是最好的解决方案吗?谁能解释我在 HQL hibernate sql 查询中使用 CURRENT_TIMESTAMP 看到的行为?

标签: springhibernatespring-data-jpatimestamphql

解决方案


推荐阅读