如何在 PostgreSQL 中检查 INTERVAL 是相对的还是绝对的

How to check that a INTERVAL is relative or absolute in PostgreSQL

我发现 Postgre 有一个非常方便的 TIMESTAMPINTERVAL 算法。但是魔术还包含一些我在执行查询时会检测到的技巧。

问题是:

Is there a way to determine if an INTERVAL is relative or absolute in Postgre?

假设我有一个包含各种 INTERVAL 的列,其中一些编码为 relative ('1 mon') 其他编码为 绝对 ('30 days').

因为相对INTERVAL必须转换成绝对INTERVAL,我们不能直接比较它们:

SELECT '1 mon'::INTERVAL = '30 days'::INTERVAL;

ReturnsTRUE,所以我们无法区分。

Relative INTERVAL出现在周之上的粒度,因为周是定义明确的最大粒度。但是这样的测试并不令人满意:

SELECT some_interval > '1 week'; 

因为它错误地将 '21 days'::INTERVAL 检测为 relative 而不是 absolute.

我知道相对和绝对 INTERVAL 之间的一个区别是 returns 将它们与 TIMESTAMP 一起使用时的算术结果不同。

SELECT '2000-02-01'::TIMESTAMP + '1 mon'::INTERVAL; 
SELECT '2000-02-01'::TIMESTAMP + '30 days'::INTERVAL;

前面的returns'2000-03-01'::TIMESTAMP和后面的returns'2000-03-02'::TIMESTAMP,明显不同

但是通过生成一些算术组合来检查相对性看起来有点奇怪(我们可能会错过一些用例)并且它无法区分 '1 week'::INTERVAL'7 days'::INTERVAL(但我们可以假设没关系,因为他们真的是平等的)。

所以,我正在寻找一个 built-inhome-made FUNCTION 来检测是否INTERVALPostgre 中是 绝对相对。有什么想法吗?

你所说的 "relative" 是包含 "mon" 或 "year" 的时间戳(因为所有月份的天数和年份都不相同) 你可以通过字符串比较来测试它:

 SELECT
     my_interval
    ,my_interval::TEXT SIMILAR TO '%(mon|year)%' AS mytest
 FROM my_table