我正在使用 PostgreSQL 函数
date_part()
来计算两个日期之间经过的(含)天数。
select date_part('day', '2019-12-31 00:00:00'::timestamp
- '2019-01-01 00:00:00'::timestamp);
在 DBeaver 中运行此查询返回的结果比预期少 1 天:
日期_部分 |
---|
364.0 |
这就像在结果中添加
+1
一样简单,但是下面的句子将返回 1
天,这似乎是错误的:
select 1 + date_part('day', '2019-01-01 00:00:00'::timestamp
- '2019-01-01 00:00:00'::timestamp);
?栏? |
---|
1.0 |
有没有更好的方法来获得值得信赖的解决方案?
如果您想包括两个日期边界,添加
+ 1
实际上是正确的做法。根据您自己的定义,“2019-1-1”和“2019-1-1”之间有一天。
既然你说的是日期,而不是时间戳,那么有一个更简单的方法:
SELECT date '2019-12-31' - date '2019-1-1' + 1;
?column?
----------
365
减去日期 返回
integer
。timestamp
值,只需转换为 date
即可截断时间分量:
SELECT ts1::date - ts2::date + 1;
你可能是说
select date_part('day', '2020-01-01 00:00:00'::timestamp - '2019-1-1 00:00:00'::timestamp);
因为它绝对正确,在 12 月 31 日 00:00:00 - 12 月 30 日 23:59:59 之后 - 只过去了 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