您好,PostgreSQL专家.

我试图理解为什么这两个布尔表达式返回不同的结果.

第一个返回TRUE,而第二个返回FALSE.

SELECT CAST('2019-01-01T12:00:00' AS TIMESTAMP) - CAST('2018-01-01T13:00:00' AS TIMESTAMP) <= INTERVAL '365 DAYS', 
       CAST('2019-01-01T12:00:00' AS TIMESTAMP) - CAST('2018-01-01T13:00:00' AS TIMESTAMP) <= INTERVAL '1 YEAR';

2019年和2018年都不是闰年.

我原以为对于非闰年,一年的间隔相当于365天的间隔,但我显然错了.

使用PostgreSQL 15进行了测试.

我们将非常感谢您的帮助!

Edit:个 因此,这看起来更像是一个错误,而不是一个功能. 《IEC/ISO 9075-2:2016 SQL Foundation》定义了两种类型的间隔.一个称为year-month间隔,另一个称为day-time间隔.每一种类型都只能与其自身进行比较.因此,我的谓词应该会因为类型不兼容而引发错误.这将 for each 使用它的人省go 很多令人头痛的问题.如果有PostgreSQL贡献者阅读这篇文章,我认为应该考虑在future 的版本中实现这一点.

推荐答案

波斯格雷斯似乎将一年的间隔定义为365.25天.

这是因为间隔类型不包括带根的开始时间和结束时间.这是一个没有位置的尺码.

如果你愿意,你可以比较1 metre1 metre from my chair.

所以间隔时间不知道你说的是which年.

所以它平均为365.25天,这大约是如果你把大部分4年的周期平均下来得到的.

您可以使用以下命令进行判断:

select extract(epoch from interval '1 year')

这个等于31557600,你可以从那里算起.

Edit:我在一些 comments 后感到好奇,并发现:

A)这比我想象的要复杂得多

B)这是一个有点移动的目标.

2022年4月的这项promise 声称要撤销一项回归,由于四舍五入(AFAICT),它变成了365天,而不是365.25天.它链接到(显然)引入这一点的promise ,也就是2021年4月.修复程序特别提到它依赖于Days_Per_Year是0.25的倍数.

https://github.com/postgres/postgres/commit/f2a2bf66c87e14f07aefe23cbbe2f2d9edcd9734

我用的是365.25的postgres版本是14.6 SELECT VERSION()个赠送 PostgreSQL 14.6 (Debian 14.6-1.pgdg110+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit

所以我的安装是在引入舍入问题之前的,@atmo有一个来自那之后,在这个修复程序发布之前.

(这里得出的所有结论都是通过阅读 comments 得出的,而不是代码).

日期和时间.硬的.

Sql相关问答推荐

从2个表中查找每条记录的唯一最接近的日期匹配

如果开始期间不存在PostgresSql回填数据

如何嵌套两条SQL语句

Ffltter&;Dart SQL Lite包:是否可以在一个查询中执行多条更新语句(每次执行不同的WHERE参数)

值对于类型字符来说太长

查询页面推荐

如何计算给定日期前三个月的值以及月初数据?

SQL到Snowflake-转换嵌套的SELECT(值

显示十进制列,但尽可能显示为整数

如何在android房间中进行多个加入

SQL 查找 varchar 类型列及其值中多次出现的子字符串

列(值不为空)到其他有序列

如何对 jsonb 中的字段执行求和,然后使用结果过滤查询的输出

为什么在事务中未被后续使用的CTE执行SELECT...FOR UPDATE无效?

如何仅在满足条件时才按顺序在 SQL 中计数?

PostgreSQL 如何在一组项目及其数量上找到完全相同的订单?

使用标准SQL 触发更新当前日期

查找距上一条记录大于或等于 30 天的记录

sql count distinct by column 和 sum false 和 true

SQL 中的问题与包含最大日期的记录连接