php - SQL 查找特定日期在 dateTimeStart 和 dateTimeFinish 之间或之间的条目
解决方案
我们需要检查行中日期时间值的重叠,包括开始和结束日期时间
从视觉上看,给定我们要检查重叠的开始和结束,有几种可能性:
start end
| |
s--e | | no overlap
s----e | overlap (*)
s--------e | overlap
s---------------e overlap
s------------------e overlap
s---e | overlap
s----------e overlap
s-------------e overlap
| s---e | overlap
| s-------e overlap
| s----------e overlap
| s----e overlap (*)
| | s---e no overlap
要找到不重叠的行(假设 start_date_time 总是在 end_date_time 之前,并且两者都是非空的),我们可以使用这样的测试:
WHERE r.end_date_time < '2019-03-21 00:00'
OR r.start_date_time >= '2019-03-22 00:00'
如果行上的“结束”在我们要测试的范围的开始之前,则没有重叠。或者,如果行上的“开始”在范围的末尾或之后,则没有重叠。
这是在 2019 年 3 月 21 日随时检查是否有任何重叠。(“开始”是 3/21,“结束”是 3/22。)
反转该条件将为我们提供重叠的行:
WHERE NOT ( r.end_date_time < '2019-03-21 00:00'
OR r.start_date_time >= '2019-03-22 00:00'
)
可以重写:
WHERE r.end_date_time >= '2019-03-21 00:00'
AND r.start_date_time < '2019-03-22 00:00'
(请注意,如果 start_date_time 和/或 end_date_time 的值可以为 NULL,或者 end_date_time 可以在 start_date_time 之前,我们需要更详细的条件。)
推荐阅读
- java - 游戏开发的多线程问题?
- ros - 罗技 F710 操纵杆力反馈错误的 teleop_twist_joy
- azure-container-service - Azure Docker 容器跨 vlan 到 Azure VM?
- iiif - IIIF:获取书中所有页面的 ID 列表,给定书中的一页
- r - R中带有嵌套分类变量和纹理填充的堆积条形图
- http - 在 Go 中使用 HTTP 与使用 TCP 套接字将文件下载/上传到服务器有什么优势?
- uwp - 找不到内置类型和命名空间
- r - 有没有办法将结果保存在表格、数据框、矩阵或数组中
- android - 如何对 Arraylist 进行排序
基于另一个数组列表 在科特林 - java - 如何在不重写整个文件的情况下替换文本文件中的特定行?