在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'

查询返回:

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

我希望查询在3月28日返回这两天,因为一个月的间隔等于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小时过go 了.

就你而言:

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相关问答推荐

如何在Windows中安装sql for golang

org.postgresql. util.PSQLException:使用docker + docker—compose + kafka + springboot时try 连接失败

在 postgresql 数据库 timestampz 中保留用户偏移量

Spring:如何在 PostgreSQL 中使用 KeyHolder

在 Postgres 中查询 JSON 对象数组

如何在 PostgreSQL hstore 中使用通配符查询值

Postgres中的GROUP BY - JSON数据类型不相等?

DbProviderFactory 与 Npgsql?

我应该使用哪个 postgresql 包?

如何将 DELETE 的返回值插入到 postgresql 中的 INSERT 中?

如何使用 SpringBoot + JPA 存储 PostgreSQL jsonb?

无法安装 psycopg2 Ubuntu

如何正确索引多对多关联表?

如何使用 Django Migrations 重新创建已删除的表?

如何缩小 pg_toast 表?

在 Postgres 中显示关系、序列和函数的默认访问权限

如何使 array_agg() 像 mySQL 中的 group_concat() 一样工作

Postgis / Geodjango:无法确定数据库的 PostGIS 版本

psql 将默认 statement_timeout 设置为 postgres 中的用户

如何在不丢失openproject数据的情况下将postgresql数据库从10升级到12