Mysql 从Sql中的表中选择不同的日期间隔
包含起始日期和截止日期的表。查询应删除FromDate和ToDate在已存在行间隔内的行 桌子 结果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点至下午
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.bookingID
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