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