Postgres 内部如何计算月份间隔?

How are months intervals internally calculated in Postgres?

在PostgreSQL中,'1个月'的间隔有时算作30天,有时算作31天。确定这一点的标准是什么?

我运行下面的查询来证明我的困惑。

select 
  now() - interval '1 month'
, now() - interval '30 days'
, interval '30 days' = interval '1 month'
, interval '31 days' = interval '1 month'

查询returns:

2022-03-27 21:09:30.933434+00 | 2022-03-28 21:09:30.933434+00 | true | false

我希望查询在 3 月 28 日这两天 return,因为一个月的间隔等于 30 天的间隔。

归结为具体与一般,其中 day 是具体而 month 不是。 dayhour 也会发生同样的情况,如:

select '2022-03-13 12:00 PDT'::timestamptz - '1 day'::interval;
        ?column?        
------------------------
 2022-03-12 12:00:00-08

select '2022-03-13 12:00 PDT'::timestamptz - '24 hours'::interval;
        ?column?        
------------------------
 2022-03-12 11:00:00-08

DST 发生在 PST/PDT 的 2022-03-13 早上。所以一天被概括为一天前的同一时间,而 24 小时前实际上是 24 小时过去了。

你的情况:

select 
  now() - interval '1 month'
, now() - interval '30 days';
           ?column?            |           ?column?            
-------------------------------+-------------------------------
 2022-03-27 14:44:33.515669-07 | 2022-03-28 14:44:33.515669-07

1 month 将返回一个月前的同一日期和时间,而 30 days 将返回实际的 30 天。

在这种情况下:

select '2022-03-30 21:17:05'::timestamp - interval '1 month' ;
  ?column?       
---------------------
 2022-02-28 21:17:05

2 月没有第 30 天,所以它是实际的月底,即 28 日。