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

Hin*_*ama 9 postgresql

在 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'
Run Code Online (Sandbox Code Playgroud)

查询返回:

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

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

Adr*_*ver 12

归结为具体与一般,哪里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

Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

在这种情况下:

select '2022-03-30 21:17:05'::timestamp - interval '1 month' ;
  ?column?       
---------------------
 2022-02-28 21:17:05
Run Code Online (Sandbox Code Playgroud)

2 月没有 30 日,因此实际的月底是 28 日。

  • 为后代添加相关文档:https://www.postgresql.org/docs/current/functions-datetime.html (6认同)