Mysql 从Sql中的表中选择不同的日期间隔

Mysql 从Sql中的表中选择不同的日期间隔,mysql,sql,sql-server,Mysql,Sql,Sql Server,包含起始日期和截止日期的表。查询应删除FromDate和ToDate在已存在行间隔内的行 桌子 结果 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年5月1日,第1行涵盖的时间为上午10点至下午

包含起始日期和截止日期的表。查询应删除FromDate和ToDate在已存在行间隔内的行

桌子

结果

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年5月1日,第1行涵盖的时间为上午10点至下午2点。时间为下午1点到下午2点的第2行已包含在第1行中

编辑

为了更清楚地说明情况,表中的两个间隔不能超过,即intreval B中的A是唯一的复杂性级别。
因此,如果在intreval 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 )
或者只包括以下其中一个记录:

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,因为你可以用一种非破坏性的方式来测试它。通过更改要删除的前两个单词并去掉NOT,可以很容易地切换回DELETE查询。

这将返回另一条记录中包含的所有记录

SELECT B.* 
FROM tableName A
LEFT JOIN tableName B
 on A.FromDate<= B.FromDate
and A.ToDate>= B.FromDate
and A.bookingID < B.BookingID
删除

Delete from TableName where ID not in 
(Select b.ID
    FROM tableName A
    LEFT JOIN tableName B
     on A.FromDate<= B.FromDate
    and A.ToDate>= B.FromDate)
and A.bookingID < B.BookingID
然而,如果您还需要以某种方式指示和处理重叠,而不仅仅是完全包含,那就不同了。因此,清楚地了解你想要实现的目标会有所帮助

是吗

想要简单地消除完全包含在另一个系统中的预订吗? 国旗预订有哪些重叠? 确定包含在其他文件中的预订?
您给我们的是您试图解决的技术问题,但是如果没有上下文和用例,您将得到您想要的,这可能不是您试图解决的问题。这是一个吗?

这是一个真正应该使用脚本语言(如php或python@TobyAllen:谢谢你的建议,我在想,如果SQLSQL不是一种真正合适的编程语言,那么它的逻辑非常复杂,因此,我认为它需要一个简单的脚本或一个极其复杂的存储过程。你是在试图删除你说的删除行,还是在尝试执行一个不会选择这些行的查询?我不同意@Toby。这非常适合SQL,甚至可能比其他选项更好。所有这些解决方案都具有一个级别的复杂性,但是如果在intreval B中有A,在区间C中有B,在区间D中有C,结果会是什么?它是否只返回D记录?@xQbert:谢谢你的回答,想要简单地消除完全包含在another@xQbert当前位置我尝试了建议的解决方案。但是运气不好:你已经指定了A.bookingIDSELECT B.* FROM tableName A LEFT JOIN tableName B on A.FromDate<= B.FromDate and A.ToDate>= B.FromDate and A.bookingID < B.BookingID
Delete from TableName where ID not in 
(Select b.ID
    FROM tableName A
    LEFT JOIN tableName B
     on A.FromDate<= B.FromDate
    and A.ToDate>= B.FromDate)
and A.bookingID < B.BookingID