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

时间:2015-04-28 18:56:53

标签: mysql sql sql-server

包含From Date和To Date的表格。查询应删除那些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行,时间是下午1点到下午2点。

修改

为了更清楚这种情况,表中的两个区间不能多,即在int中的A是唯一的复杂程度。 如果在B中应该删除B,那么如果A中的A

2 个答案:

答案 0 :(得分:5)

我认为您可以使用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 )

我不确定你是如何定义&#34;在区间&#34;但这应该给你正确的想法。

由于我现在明白你正试图从表中实际删除记录,你必须反转逻辑并使其成为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,因为您可以以非破坏性的方式对其进行测试。通过将前两个单词更改为DELETE并删除它,可以轻松切换回DELETE查询NOT。)

答案 1 :(得分:1)

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

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

但是,如果您还需要以某种方式指示和处理OVERLAP而不仅仅是完全包含,那就不同了。因此,清楚地了解你想要完成的事情会有所帮助。

你是

吗?
  1. 想要简单地删除完全包含在另一个中的预订吗?
  2. 重叠的旗帜预订?
  3. 确定其他人包含的预订?
  4. 您给我们的是您尝试解决的技术问题,但如果没有上下文和用例,您将得到您所要求的内容,这可能不是您的问题#39;重新尝试解决的问题是XY problem