如何在 PostgreSQL 中检查 INTERVAL 是相对的还是绝对的
How to check that a INTERVAL is relative or absolute in PostgreSQL
我发现 Postgre
有一个非常方便的 TIMESTAMP
和 INTERVAL
算法。但是魔术还包含一些我在执行查询时会检测到的技巧。
问题是:
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-in 或 home-made FUNCTION
来检测是否INTERVAL
在 Postgre
中是 绝对 或 相对。有什么想法吗?
你所说的 "relative" 是包含 "mon" 或 "year" 的时间戳(因为所有月份的天数和年份都不相同)
你可以通过字符串比较来测试它:
SELECT
my_interval
,my_interval::TEXT SIMILAR TO '%(mon|year)%' AS mytest
FROM my_table
我发现 Postgre
有一个非常方便的 TIMESTAMP
和 INTERVAL
算法。但是魔术还包含一些我在执行查询时会检测到的技巧。
问题是:
Is there a way to determine if an
INTERVAL
is relative or absolute inPostgre
?
假设我有一个包含各种 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-in 或 home-made FUNCTION
来检测是否INTERVAL
在 Postgre
中是 绝对 或 相对。有什么想法吗?
你所说的 "relative" 是包含 "mon" 或 "year" 的时间戳(因为所有月份的天数和年份都不相同) 你可以通过字符串比较来测试它:
SELECT
my_interval
,my_interval::TEXT SIMILAR TO '%(mon|year)%' AS mytest
FROM my_table