You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.04 16:15:42