mysql - 从 SQL 中的表中选择不同的日期间隔

标签 mysql sql sql-server

包含起始日期和截止日期的表格。查询应删除 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/

相关文章:

sql-server - 如何在sql server中获取两个日期之间的当前月份名称,开始日期和结束日期

sql-server - 当前存在INNER JOIN的情况下,锁定语句无法编译

Mysql 数据库在 .EXE vb.net 控制台文件上崩溃

mysql - 在 MySQL 中添加日期和时间到时间戳

php - 无法在 php 中创建新的 MySQL 数据库

Python、带有变量的 mySQL

mysql - where 不存在条件语法

java - sql删除没有错误但不要删除记录(除非我在Where子句中使用Firstname)

mysql - SQL Join,不确定复杂查询中的确切语法

sql-server - 如何跟踪 SQL Server 故障审核事件?