在 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;
我正在使用 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;