SQL WHERE子句如何筛选两个不同日期的相同时间段数据
SQL筛选指定日期固定时段记录实现方案
核心逻辑
要筛选多个指定日期下同一时段的记录,有两种成熟实现思路:
- 硬编码拼接每个日期的时间范围,兼容性、查询性能最优
- 拆分日期、时间维度分别匹配,后续扩展筛选规则更方便
写法1:范围硬拼接(全SQL方言兼容,推荐大数据量表使用)
直接用OR拼接每个目标日期的时间区间,所有SQL数据库都支持,且能命中VisitationDateTime字段上的索引,查询效率最高:
WHERE (VisitationDateTime >= '2020-01-01 00:00:00' AND VisitationDateTime < '2020-01-01 12:00:00') OR (VisitationDateTime >= '2020-01-03 00:00:00' AND VisitationDateTime < '2020-01-03 12:00:00')
注意:时间区间统一用左闭右开写法(开始边界用
>=、结束边界用<),不要写<= '2020-01-01 12:00:00'。如果字段存储精度包含毫秒/微秒,比如存在2020-01-01 12:00:00.003这类值,闭区间写法会出现边界数据漏判。
写法2:日期+时间拆分匹配(规则扩展方便)
如果后续需要新增同规则的筛选日期,这种写法只需要在日期集合里加值即可,不需要重复写时间区间,不同数据库的函数适配如下:
MySQL
WHERE -- 匹配目标日期,如果VisitationDate和VisitationDateTime日期始终一致,可直接替换为 VisitationDate IN ('2020-01-01','2020-01-03'),性能更好 DATE(VisitationDateTime) IN ('2020-01-01', '2020-01-03') -- 匹配0点到12点时段 AND TIME(VisitationDateTime) >= '00:00:00' AND TIME(VisitationDateTime) < '12:00:00'
SQL Server
WHERE CAST(VisitationDateTime AS DATE) IN ('2020-01-01', '2020-01-03') AND CAST(VisitationDateTime AS TIME) >= '00:00:00' AND CAST(VisitationDateTime AS TIME) < '12:00:00'
PostgreSQL
WHERE VisitationDateTime::DATE IN ('2020-01-01', '2020-01-03') AND VisitationDateTime::TIME >= '00:00:00' AND VisitationDateTime::TIME < '12:00:00'
性能提示:如果表数据量超过百万级,不建议对
VisitationDateTime使用函数转换后匹配,会导致字段上的普通索引失效,优先选择写法1的范围查询。
内容的提问来源于stack exchange,提问作者Fixer
相关产品推荐
相关产品推荐

