SQL发现时间重叠通过午夜(跨越2天)

时间:2010-05-03 18:25:18

标签: sql logic

我知道有很多这类问题,但我没有看到一个与我的标准相似的问题。所以我想请求你的帮助。我拥有的字段只是时间类型的开始和结束。我不能涉及任何具体日期。如果时间范围没有在一天中午夜过去,我只会比较两个元组:

end1 > start2 AND start1 < end2

(此处触摸的终点不会被视为重叠。)

但是当我涉及通过(或在)午夜的时间范围时,这显然不起作用。例如,给定:

 start  |   end
--------+--------
06:00PM | 01:00AM
03:00PM | 09:00PM

如果不涉及日期,我该如何实现这一目标。我的假设是,如果结束不到开始,那么我们将涉及2天。

我正在尝试在普通的标准SQL中执行此操作,因此只需在WHERE子句中使用简单而简洁的逻辑。

谢谢大家!


添加了:

另外,我如何测试一个时间范围是否完全包围另一个时间范围?再次感谢!

4 个答案:

答案 0 :(得分:2)

如果您的SQL支持时差:

(end1 - start1) > (start2 - start1) AND (end2 - start2) > (start1 - start2)

答案 1 :(得分:1)

不幸的是,“普通”SQL对于实际数据库来说太普遍了。原因是各种数据库产品对计算两次之间的持续时间有不同程度的支持。例如,在SQL Server 2008中,将时间值转换为DateTime然后进行比较会非常简单,因为时间数据类型不支持许多比较运算符。

Select ...
From    (
        Select Cast(T.Start1 As DateTime) As Start1
            , Case
                When Cast(T.Start1 As DateTime) > Cast(T.End1 As DateTime) Then DateAdd(d,1,Cast(T.End1 As DateTime))
                Else Cast(T.End1 As DateTime)
                End As End1
        From ...
        ) As T
Where T.End1 > T2.Start2 And T1.Start2 < T2.End2            

答案 2 :(得分:0)

使用开始时间和持续时间(以分钟为单位或任何适当的单位)

答案 3 :(得分:0)

程序Transtar遇到了这个问题。时间数据与任何日期无关,时间数据也不在日期时间字段中。该计划最初设计为从早上4点到午夜发布过境通行证,只要运输不是全天候就可以正常工作。我建立了一个功能,它对时间进行滑动测试,这样如果你要求上午5点,它会查看凌晨1点到12点59分的时间。我是用FORTRAN写的,但无论语言如何,algorythm都是一样的。