Date和Postgresql TimestampTZ不生成预期结果

时间:2017-11-25 08:45:24

标签: java postgresql date datetime

我知道我误解了一些事情。但我无法弄清楚是什么。

我有一个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'在第一个查询中做了什么以及为什么这不适用于第二个查询呢?

0 个答案:

没有答案