首页 > 解决方案 > SQL 查找特定日期在 dateTimeStart 和 dateTimeFinish 之间或之间的条目

问题描述

我正在寻找运行一个查询来获取在特定日期发生的所有行。

在此处输入图像描述

例如,如果我想要 2019 年 3 月 21 日发生的所有条目,则查询应该返回这两个条目。

关于如何做到这一点的任何想法?

标签: phpmysqlsqldatephpmyadmin

解决方案


我们需要检查行中日期时间值的重叠,包括开始和结束日期时间

从视觉上看,给定我们要检查重叠的开始和结束,有几种可能性:

     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 之前,我们需要更详细的条件。)


推荐阅读