我知道我误解了一些事情。但我无法弄清楚是什么。
我有一个UTC的postgresql服务器。在表格中,我每季度收取的金额。
amount_charged | create_date
100 | 2017-11-24 22:00:00+00
200 | 2017-11-24 22:15:00+00
550 | 2017-11-24 22:30:00+00
...
由于这是在UTC,我的时区是非洲/开罗,如果我想在开罗的11月25日总和所有金额,上面的预期结果将 850
@Query(value = "SELECT * FROM subscription_service.charge_quarter c
WHERE date(c.create_date AT TIME ZONE 'Africa/Cairo' ) =
date(current_timestamp AT TIME ZONE 'Africa/Cairo') ORDER BY c.create_date DESC", nativeQuery = true)
List<ChargeQuarter> findAllByOrderByCreateDateDesc();
这确实给了我 850
我的另一个问题是
@Query(value = "SELECT reason, sum(sum_amount)
FROM subscription_service.charge_quarter c
WHERE c.create_date >= ?1 GROUP BY reason ORDER BY 2 DESC", nativeQuery = true)
List<Object[]> findAllTodayRevenuesByReason(Date today);
today
的计算方法是:
ZoneId zoneId = ZoneId.of('Africa/Cairo');
final Date today = Date.from(LocalDate.now(zoneId).atStartOfDay(zoneId).toInstant());
这也会产生 850 。
但我的理解是Date
是EPOCH的毫秒数。所以我试图用today
来计算当开罗时钟显示“2017-11-25 00:00”时从EPOCH传递的毫秒数。
当我将上面的查询更改为:
@Query(value = "SELECT reason, sum(sum_amount)
FROM subscription_service.charge_quarter c
WHERE (c.create_date AT TIME ZONE 'Africa/Cairo') >= ?1 GROUP BY reason ORDER BY 2 DESC", nativeQuery = true)
List<Object[]> findAllTodayRevenuesByReason(Date today);
然后这个数字会比 850 (比如 1200 )更大,因为很明显它也会从11月24日开始获得一些数字。我希望它能保持相同。
显然c.create_date AT TIME ZONE 'Africa/Cairo'
不正在做我想做的事情,或today
没有计算我期望它计算的内容。
但与此同时,如果我没有将第一个查询转换为时区,则查询会减少 850 ,这意味着它不会考虑2017-11-24 22:00:00+00 to 2017-11-25 00:00:00+00
之间的时间
那么AT TIME ZONE 'Africa/Cairo'
在第一个查询中做了什么以及为什么这不适用于第二个查询呢?