Sql 为什么回溯时间时,age()的结果并不总是等于间隔?

Sql 为什么回溯时间时,age()的结果并不总是等于间隔?,sql,postgresql,datetime,Sql,Postgresql,Datetime,我在PostgreSQL 9.6转弯日期计算中遇到了一些SQL代码的意外行为。在分析过程中,我发现Postgres返回ndays并用age()计算持续时间时,并不总是返回相同的值 考虑以下代码:我们将某一天设置为“基准”,返回45天,然后计算持续时间 WITH basedate AS (SELECT '2018-05-01'::date AS b), myperiod AS (SELECT (basedate.b - interval '45 days') AS "startDate

我在PostgreSQL 9.6转弯日期计算中遇到了一些SQL代码的意外行为。在分析过程中,我发现Postgres返回
n
days并用
age()计算持续时间时,并不总是返回相同的值

考虑以下代码:我们将某一天设置为“基准”,返回45天,然后计算持续时间

WITH basedate AS (SELECT '2018-05-01'::date AS b), 
     myperiod AS (SELECT (basedate.b - interval '45 days') AS "startDate",
     basedate.b AS "endDate" FROM basedate)
SELECT age("endDate","startDate") FROM myperiod;
我希望此查询始终会导致
45天
。但是,如果我将我的
基准日期
更改为
2018-06-01
,我将得到
44天

为什么会这样

我猜这与五月有31天的假期有关。但是,我无法准确解释原因,因为如果我将
45天
更改为
15天
2018-05-01和
2018-06-01
将导致相同的持续时间,这不完全正确

您的第一个查询返回

年龄
---------------
1个星期一15天
(1排)
如果您将日期修改为
2018-06-01
,您将获得

年龄
---------------
1个星期一14天
(1排)
两者都是正确的,不是吗

问题在于PostgreSQL在函数中将一个月视为30天,如
justify\u interval

SELECT justify_interval('45 days');

 justify_interval 
------------------
 1 mon 15 days
(1 row)

但是,另一种选择是抛出一个错误,并且行为被清楚地记录下来。

Laurenz Albe的回答指出了正确的事情:我应该期望一个从
1个月开始的结果

问题实际上在客户端,在本例中是OmnidB2.8。请参见此处:该问题已在OmniDB 2.9中修复

在我测试过的所有其他客户中,我都得到了劳伦斯·阿尔比预测的结果

因此,如果您在这里遇到类似问题:无论如何,检查问题是否存在于您的客户机或您使用的库中。

相关:以及