是否有任何MySQL函数获取所有行的开始或结束日期落在给定开始日期和结束日期之间的行?

问题描述:

我有一个记录开始和结束时间的事件表作为MySQL DATETIME对象(格式为YYYY-MM-DD HH:MM:SS。我想查找在特定日期范围内发生的所有事件,但事件可以跨越多天我的日期范围之外,但我想回报他们,如果他们连1秒或以上,我的日期范围重叠)。是否有任何MySQL函数获取所有行的开始或结束日期落在给定开始日期和结束日期之间的行?

建议?

这会发现,被完全包含在范围内的每个事件:

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 

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' 

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

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

A)与范围

乙内的结束日期的事件)与所述范围内的开始日期

C)与所述范围

d)中同时开始和结束日期的事件的事件事件开始和结束日期外部范围,但重叠

罗伯特的答案是好的,但它没有考虑到案例D,其中事件s范围之前的馅饼,范围之后的结尾。

+0

如果你覆盖A或B,你不必担心C. – 2008-11-10 14:27:17

@鳃蜥蜴和@罗伯特赌博的答案是正确的问题,但我不知道你是否问你的想法是什么......如果你正在寻找重叠的事件,那么你需要考虑比您的搜索范围更长的事件。

  Monday Tuesday Wednesday Thursday 

Search:    |-----------| 

Shopping      |-----|    Found OK 
Eating    |--------|      Found OK 
Stack Overflow |---------------------------------| Not found! 

如果你想SO包括,你会怎么做:

SELECT * FROM table WHERE (start_date < end_of_range AND end_date > start_of_range)

Llya,罗伯茨回答着,

SELECT * FROM表WHERE起始日期< = end_of_range 和stop_date > = start_of_range

正常工作,

D)事件的起始日期和结束日期都在范围之外,但重叠在一起

??