在 PostgreSQL 中计算两个日期之间的天数时出错

Error calculating the number of days between two dates in PostgreSQL

我正在使用 date_part PostgreSQL 函数来计算两个日期之间经过的(含)天数。

select date_part('day', '2019-12-31 00:00:00'::timestamp - '2019-1-1 00:00:00'::timestamp);

运行 DBeaver 中的此查询 returns 比预期少 1 天:

date_part|
---------+
    364.0|

就像在结果中添加 +1 一样简单,但是下面的句子会 return 1 天,这显然是错误的:

select 1 + date_part('day', '2019-1-1 00:00:00'::timestamp - '2019-1-1 00:00:00'::timestamp);

?column?|
--------+
     1.0|

是否有更好的方法来获得可信的解决方案?

你的意思可能是

select date_part('day', '2020-01-01 00:00:00'::timestamp - '2019-1-1 00:00:00'::timestamp);

因为它绝对正确,所以在 00:00:00 12 月 31 日 - 就在 23:59:59 12 月 30 日之后 - 它只过去了整整 364 天。

迂回方式:

select 
   count(*) AS days 
from 
   generate_series('2019-1-1 00:00:00'::timestamp, 
                   '2019-12-31 00:00:00'::timestamp, '1 day');
 days 
------
  365

如果您想 包括 两个日期边界,添加 + 1 实际上是正确的做法。根据您自己的定义,'2019-1-1'和'2019-1-1'之间有一个天。

既然你说的是日期,而不是时间戳,那么有一个更简单的方法:

SELECT date '2019-12-31' - date '2019-1-1' + 1;

 ?column? 
----------
      365

减去日期 returns integer.
如果您的输入是 timestamp 值,只需转换为日期以截断时间组件:

SELECT ts1::date - ts2::date + 1;