【发布时间】:2020-10-28 18:33:08
【问题描述】:
考虑我的架构:
CREATE TABLE t_date (
t_date_id int PRIMARY KEY
, valid_from date NOT NULL
, valid_to date DEFAULT 'infinity'
);
有时我有valid_to 日期,有时我有infinity 那里...
如何正确过滤以获得最短范围的行?
我试过了:
(DATE_PART('day', valid_to::timestamp - valid_from::timestamp))
但这导致:
PG::DatetimeFieldOverflow: ERROR: cannot subtract infinite timestamps`
我有过滤器来选择有效范围:valid_from <= ? AND valid_to > ?
这个想法是获取(一个)具有最短范围的有效行。
示例
INSERT INTO t_date VALUES
(1, '2020-01-01', '2020-09-01')
, (2, '2020-01-10', '2020-01-12')
, (3, '2020-01-15', 'INFINITY')
, (4, '2020-01-16', 'INFINITY') -- shortest among infinities
, (5, '2020-01-14', 'INFINITY')
;
如果今天是11/jan,我希望得到'2020-01-10' | '2020-01-12',因为它在 1 月 11 日和最短的时间内有效。
如果今天是14/jan,我希望得到'2020-01-01' | '2020-09-01',因为它在 1 月 14 日和最短的时间内有效。
如果今天是17/jan,我希望得到'2020-01-16' | 'INFINITY'。
如果稍后我创建了类似 '2020-01-15' | '2059-01-15' 的内容,则应该返回它,因为它比 INFINITY 行短。
【问题讨论】:
-
我冒昧地按照我的理解来澄清这个问题。 (使用正确的 SQL 语句和 ISO 日期。)如果我没有让你正确,请纠正。
标签: sql database postgresql date-range postgresql-11