为什么postgres date_trunc返回24小时?

时间:2016-06-08 20:39:45

标签: postgresql timestamp

问题究竟是什么。

mydb=> select '2016-01-03 24:00'::timestamp;
      timestamp
---------------------
 2016-01-04 00:00:00
(1 row)

这就是我的预期。

mydb=> select date_trunc('seconds', '2016-01-03 23:59.9999999999'::timestamp);
     date_trunc
---------------------
 2016-01-03 00:24:00
(1 row)

庵。等等,什么?

1 个答案:

答案 0 :(得分:4)

它与date_trunc无关......一旦引入小数点,23:59.9999999999被解释为分钟和秒而不是小时和分钟。

没有小数点

db=# select '2016-01-03 23:59'::timestamp;
      timestamp      
---------------------
 2016-01-03 23:59:00
(1 row)

带小数点

db=# select '2016-01-03 23:59.9999999'::timestamp;
      timestamp      
---------------------
 2016-01-03 00:24:00
(1 row)

这是可以理解的,考虑到你期望回来的东西,但你似乎在24小时内误读了24分钟。

作为旁注,一旦你超过小数位后的六位数(即微秒),四舍五入就开始了:

db=# select '2016-01-03 23:59.999999'::timestamp;
         timestamp          
----------------------------
 2016-01-03 00:23:59.999999
(1 row)