包含起始日期和截止日期的表格。查询应删除 FromDate 和 ToDate 在已存在行的间隔内的那些行。
表格
bookingID FromDate ToDate
15 2015-04-29 17:00:00.000 2015-04-29 18:00:00.000
13 2015-05-01 10:00:00.000 2015-05-01 14:00:00.000
14 2015-05-01 13:00:00.000 2015-05-01 14:00:00.000
结果
bookingID FromDate ToDate
13 2015-05-01 10:00:00.000 2015-05-01 14:00:00.000
15 2015-04-29 17:00:00.000 2015-04-29 18:00:00.000
截至日期 2015-05-01,第 1 行涵盖从上午 10 点到下午 2 点的时间。时间为下午 1 点到下午 2 点的第 2 行已被第 1 行覆盖。
编辑
为了更清楚地说明情况,表中不能有更多的两个区间,即区间 B 中的 A 是唯一的复杂程度。 所以如果 A 在间隔 B 时应该删除 B
最佳答案
我认为您可以使用 EXISTS
子查询来完成此操作...
SELECT * FROM table a
WHERE NOT EXISTS
(SELECT * FROM table b
WHERE b.FromDate <= a.FromDate
AND b.ToDate >= a.ToDate
AND a.bookingID != b.bookingID )
我不确定您是如何定义“间隔内”的,但这应该会给您正确的想法。
既然我现在明白你正试图从表中删除记录,你将不得不反转逻辑并使其成为 DELETE 查询而不是 SELECT 查询:
DELETE FROM table a
WHERE EXISTS
(SELECT * FROM table b
WHERE b.FromDate <= a.FromDate
AND b.ToDate >= a.ToDate
AND a.bookingID != b.bookingID )
为了允许可能有 2 条记录具有相同的 FromDate
和相同的 ToDate
的情况,我们可以像这样保留两条记录:
SELECT * FROM table a
WHERE NOT EXISTS
(SELECT * FROM table b
WHERE b.FromDate <= a.FromDate
AND b.ToDate >= a.ToDate
AND a.bookingID != b.bookingID
AND (b.FromDate != a.FromDate OR b.ToDate != a.ToDate) )
或者只包括这样的记录之一:
SELECT * FROM table a
WHERE NOT EXISTS
(SELECT * FROM table b
WHERE b.FromDate <= a.FromDate
AND b.ToDate >= a.ToDate
AND a.bookingID != b.bookingID
AND (b.FromDate != a.FromDate
OR b.ToDate != a.ToDate
OR a.bookingID < b.bookingID) )
(我已将它移回 SELECT,因为您可以以非破坏性方式对其进行测试。通过将前 2 个词更改为 DELETE 并去掉 NOT,它可以很容易地切换回 DELETE 查询。 )
关于mysql - 从 SQL 中的表中选择不同的日期间隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29927679/