我想检查集合中给定的日期范围是否与从数据库检索到的范围重叠。希望我能在一个查询中执行它。
如PostgreSQL文档中所述,OVERLAPS
方法的用法如下:
SELECT ('2001-02-16', '2001-12-21') OVERLAPS
('2001-10-30', '2002-10-30');
Result: true
是否有可能提供OVERLAPS
日期范围的集合?就像是:
SELECT ('2001-02-16', '2001-12-31'), ('2002-01-01', 2002-12-31), (...) OVERLAPS
('2001-10-30', '2002-10-30'), (...);
Result: true
我想我可能会有部分答案。假设我有桌子t1
:
starts_at | ends_at
------------+------------
2001-01-01 | 2001-01-02
2001-01-05 | 2001-01-06
2001-01-08 | 2001-01-09
我想检查是否在t1
某些给定的日期范围之间发生了重叠的日期。到目前为止,我已经成功解决了以下问题overlaps
:
WITH t2(starts_at, ends_at) AS(
VALUES('2001-01-01'::DATE, '2001-01-05'::DATE),
('2001-01-12'::DATE, '2001-01-15'::DATE))
SELECT *
FROM t1, t2
WHERE
t1.starts_at < t2.ends_at AND t1.ends_at >= t2.starts_at;
结果使我感到满意:
starts_at | ends_at | starts_at | ends_at
------------+------------+------------+------------
2001-01-01 | 2001-01-02 | 2001-01-01 | 2001-01-05
(1 row)
然后,如果存在任何行,我想在我的应用程序中引发异常。这是正确的方法吗?
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句