问题说的没错。

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)

嗯。等等,什么?

最佳答案

这与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)

关于postgresql - 为什么postgres date_trunc返回24小时?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37712491/

10-15 11:08