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

时间:2008-11-10 14:14:00

标签: mysql

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

建议?

5 个答案:

答案 0 :(得分:16)

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

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

答案 1 :(得分:7)

@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 < end_of_range AND end_date > start_of_range)

答案 2 :(得分: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'

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

答案 3 :(得分:1)

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

A)结束日期在

范围内的事件

B)开始日期在

范围内的事件

C)开始日期和结束日期都在

范围内的事件

D)开始和结束日期范围之外的事件,但重叠

罗伯特的回答很好,但没有考虑案例D,事件在范围之前开始,在范围之后结束。

答案 4 :(得分:0)

Llya,Roberts回答,

SELECT * FROM table WHERE start_date&lt; = end_of_range                       AND stop_date&gt; = start_of_range

可以正常使用,

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

...