Postgres重叠日期查询 - 查看两个日期作为一个范围是否与一个月重叠

4
我会翻译中文,以下是需要翻译的内容:

我正在查询一个日期范围[start_date] - [end_date]是否与某个月重叠。

到目前为止,我已经有了:

select * from my table
where (start_date, end_date) overlaps ('2000-02-01', '2000-02-28')

我需要它包含跨越月份的日期范围,即开始于月份之外但进入该月,或开始于该月并延伸到下个月: 例如:'2000-01-31', '2000-02-01' '2000-02-28', '2000-03-01' 然而,这些日期没有被包括在查询结果中。
如果我只能输入月份的日期部分而不是交叉区间('2000-02-01', '2000-02-28'),那就太好了。
任何帮助将不胜感激。

我认为你需要避免使用实际的月份开始和结束日期,因为它们变化太大了。我点赞了你的问题,因为这让我的大脑崩溃了,我很好奇结果 :) - Nebulosar
在标准SQL中,overlaps适用于包含开始时间但不包含结束时间的时间段(您可以通过在结束时间上添加一天来调整)。那么对于开始时间在该月份之前并且结束时间在该月份之后的范围呢?或者对于该月份内的范围呢? - dnoeth
2个回答

9
您可以使用 daterange 类型:
select * 
from the_table
where daterange(start_date, end_date, '[]') && daterange(date '2000-02-01', date '2000-02-28', '[]')

参数'[]'创建一个“包括”的范围。这对于部分或多个月份也可以正常工作(甚至可以有效索引)。

2
我会尽可能明确地表达:
select t.*
from mytable t
where (start_date < '2000-02-01' and end_date >= '2000-02-01')
      (end_date  > '2000-02-28' and start_date <= '2000-02-28'

这只能用于一个月,我知道这是个例子,但有没有更抽象的方法来解决这个问题?有没有办法,或者每个月都需要硬编码?那闰年呢? - Nebulosar
如果您使用标准SQL的包含-排除时间段,就不需要了解月份的结束日期,例如2000年2月是从“2000-02-01”到“2000-03-01” :-) - dnoeth
@Nebulosar……我完全不明白你的意思。这与两个月份无关,而是与两个日期有关。你只需要插入这些日期即可。 - Gordon Linoff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接