oracle - 选择时间跨度覆盖特定时间的所有行
问题描述
表行有一个开始时间列和一个结束时间列。我正在搜索时间在下午 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')
)
)
解决方案
在 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'
)
我认为这行得通(现在无法进行测试)
如果您在这里处理大量数据,这可能仍然很慢 - 即使输入/输出日期被索引,它也必须全面扫描表。
推荐阅读
- javascript - 在 Shadow DOM 的 CSS 中从 Light DOM 访问全局状态
- javascript - Node.js IF 语句由于某种原因不起作用
- java - Android 通知生成器声音不运行
- asp.net-core - 用于 ASP.NET Core 中托管的 Angular 的 URL 重写的 Web.config 文件 IIS 规则无法按预期工作
- c - 我可以在没有额外编译步骤的情况下定义库所需的 C extern 函数吗?
- html - CSS html图像不堆叠
- flutter - 我怎样才能复制这个设计?
- mysql - Laravel 过滤整个集合或使用范围
- python - URL http://localhost:8000/admin/ 重定向到错误页面
- javascript - 在 HTML 中绘制表单组