首页 > 解决方案 > 选择时间跨度覆盖特定时间的所有行

问题描述

表行有一个开始时间列和一个结束时间列。我正在搜索时间在下午 3 点到 4 点之间的任何行。换句话说,如果满足以下任一条件,则应包括该行:(1)它的开始和结束都在 3 和 4 之间,(2)它在 3 之前开始并在 4 之后结束,(3)它在 3 之前开始并在 3 之后结束,( 4) 它在 4 之前开始并在 4 之后结束。我尝试添加以下 where 子句来涵盖这 4 个选项并且它有效,但需要很长时间。似乎必须有更好的代码。

    Where
( 
    (
    (TO_CHAR(vltecl.Patient_in_ROOM_DTTM, 'HH24:MI:SS')                  < '15:00:00') 
    and (TO_CHAR(vltecl.patient_out_ROOM_DTTM, 'HH24:MI:SS')                 > '16:00:00')
    )
   or 
   (  (TO_CHAR(vltecl.Patient_in_ROOM_DTTM, 'HH24:MI:SS')                  < '16:00:00') 
    and (TO_CHAR(vltecl.patient_out_ROOM_DTTM, 'HH24:MI:SS')                 > '16:00:00')
    )
    or
    (
     (TO_CHAR(vltecl.Patient_in_ROOM_DTTM, 'HH24:MI:SS')                  < '15:00:00') 
    and (TO_CHAR(vltecl.patient_out_ROOM_DTTM, 'HH24:MI:SS')                 > '15:00:00')
    )
    or
     ((TO_CHAR(vltecl.Patient_in_ROOM_DTTM, 'HH24:MI:SS')                  < '16:00:00') 
    and (TO_CHAR(vltecl.patient_out_ROOM_DTTM, 'HH24:MI:SS')                 > '16:00:00')
    and (TO_CHAR(vltecl.Patient_in_ROOM_DTTM, 'HH24:MI:SS')                  > '15:00:00')
    )
    )

标签: oracletime

解决方案


在 oracle 中处理通用时间可能有点繁琐(而不是特定日期的特定时间)。方法通常还可以,但我认为可以通过将其转而简化一点。基本上你想要每一个与 3-4 小时重叠的,是吗?好吧,那是在 3 点之前没有结束或在 4 点之后开始的任何事情(假设“出”总是在“入”之后)

Where 
NOT (TO_CHAR(vltecl.Patient_in_ROOM_DTTM, 'HH24:MI:SS')                  > '16:00:00'
    OR TO_CHAR(vltecl.Patient_OUT_ROOM_DTTM, 'HH24:MI:SS')                 < '15:00:00'
    )

我认为这行得通(现在无法进行测试)

如果您在这里处理大量数据,这可能仍然很慢 - 即使输入/输出日期被索引,它也必须全面扫描表。


推荐阅读