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
不是。 day
和 hour
也会发生同样的情况,如:
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 日。
在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
不是。 day
和 hour
也会发生同样的情况,如:
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 日。