【问题标题】:Are there any MySQL functions to get all rows with with a start or end date that fall between a given start and end date?是否有任何 MySQL 函数可以获取所有行的开始或结束日期在给定的开始日期和结束日期之间?
【发布时间】:2008-11-10 14:13:59
【问题描述】:

我有一个事件表,其中记录了开始和结束时间作为 MySQL DATETIME 对象(格式为YYYY-MM-DD HH:MM:SS。我想查找在特定日期范围内发生的所有事件。但是,事件可以跨越多天(并且超出我的日期范围,但如果它们与我的日期范围重叠 1 秒或更长时间,我想返回它们)。

建议?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    这将找到完全包含在范围内的每个事件:

    SELECT * FROM table WHERE start_date BETWEEN start_of_range AND end_of_range 
                          AND stop_date  BETWEEN start_of_range AND end_of_range
    

    这将找到事件的任何部分与范围的任何部分重叠的任何事件:

    SELECT * FROM table WHERE start_date <= end_of_range 
                          AND stop_date  >= start_of_range
    

    【讨论】:

      【解决方案2】:

      @Bill the Lizard 和 @Robert Gamble 的回答对于所提出的问题是正确的,但我想知道您是否在问您认为自己是什么...如果您正在寻找重叠事件,那么您需要考虑比您的搜索范围更长的事件。

                 Monday   Tuesday   Wednesday   Thursday
      
      Search:                |-----------|
      
      Shopping                       |-----|              Found OK
      Eating              |--------|                      Found OK
      Stack Overflow |---------------------------------|  Not found!
      

      如果你想包含 SO,你会这样做:

      SELECT * FROM table WHERE (start_date &lt; end_of_range AND end_date &gt; start_of_range)

      【讨论】:

        【解决方案3】:
        SELECT *
        FROM table
        WHERE startdate >= 'starting date' AND startdate < 'ending date'
            OR enddate >= 'starting date' AND enddate < 'ending date'
        

        应该适合你。

        确保指定“开始日期”和“结束日期”并包含时间。

        '2008-01-01 00:00:00'' AND '2008-01-31 23:59:59'
        

        这将有助于避免日期相同但您的时间在几小时、几分钟或几秒内的错误。

        【讨论】:

          【解决方案4】:

          基本上,您可以使用常规比较 - 上述比较应该有效 - 诀窍是检查所有可能发生的不同情况。

          A) 结束日期在该范围内的事件

          B) 开始日期在该范围内的事件

          C) 开始日期和结束日期都在范围内的事件

          D) 开始日期和结束日期超出范围但重叠的事件

          Robert 的回答很好,但它没有考虑案例 D,即事件在范围之前开始并在范围之后结束。

          【讨论】:

          • 如果你覆盖A或B,你不必担心C。
          • 你说得对,我只是想说明一个事件可能重叠的所有可能方式。
          【解决方案5】:

          Llya,罗伯茨回答,

          SELECT * FROM table WHERE start_date = start_of_range

          工作正常,

          D) 开始日期和结束日期超出范围但重叠的事件

          ??

          【讨论】:

            猜你喜欢
            • 2020-10-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-09-14
            • 2019-04-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多