gpt4 book ai didi

sql - 测试两个日期的间隔是否不参与其他间隔

转载 作者:行者123 更新时间:2023-11-29 14:06:35 25 4
gpt4 key购买 nike

我的表中有 StartDateEndDate,如下所示:

+----+----------------------+--------------------+
| id | start_date | end_date |
+----+----------------------+--------------------+
| 1 | 2016-10-24 09:00:00 |2016-10-24 10:30:00 |
| 2 | 2016-10-31 09:00:00 |2016-10-31 10:30:00 |
+----+----------------------+--------------------+

我想测试我的新记录(new start_dateend_date)是否没有参与 ONE SECONDE 其他记录。

我曾经测试过所有的可能性,但我认为这需要很长时间对于这个问题有什么好的解决方案,我尝试使用这个查询它工作正常,但需要时间:

select * from myTable where 

(new_start_date >= myTable.start_date and new_end_date <= myTable.end_date)

or (new_start_date > myTable.start_date and new_end_date < myTable.end_date)

or (new_start_date > myTable.start_date and new_end_date < myTable.end_date)

or (new_start_date < myTable.start_date and new_end_date > myTable.end_date)

or (new_start_date < myTable.start_date and new_end_date = myTable.end_date)

or (new_start_date = myTable.start_date and new_end_date > myTable.end_date)

这个问题还有其他解决方案吗?

这是我能得到的所有可能性

如果:

newSD_______startdate___newED_____enddate_____ : return false

newSD_______startdate________enddate___newED__ : return false

___startdate___newSD____newED_____enddate_____ : return false

___startdate___newSD_____enddate___newED______ : return false

____startdate_____enddate___newED___newED_________ : return true

___newED___newED___startdate_____enddate__________ : return true

谢谢。

最佳答案

这将显示与新的开始/结束间隔重叠的所有行。

select *
from myTable
where (new_start_date, new_end_date) overlaps (start_date, end_date);

以上是ANSI标准SQL。


如果需要,您可以创建一个约束来防止插入重叠的行。

这是通过 exclusion constraint 完成的在 range type - 一种唯一约束,但适用于范围。

alter table mytable
add constraint no_overlap
exclude using gist (tsrange(start_date, end_date) with &&);

排除约束是 Postgres 特定的。

关于sql - 测试两个日期的间隔是否不参与其他间隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40248626/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com