【发布时间】:2008-11-10 14:13:59
【问题描述】:
我有一个事件表,其中记录了开始和结束时间作为 MySQL DATETIME 对象(格式为YYYY-MM-DD HH:MM:SS。我想查找在特定日期范围内发生的所有事件。但是,事件可以跨越多天(并且超出我的日期范围,但如果它们与我的日期范围重叠 1 秒或更长时间,我想返回它们)。
建议?
【问题讨论】:
标签: 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
【讨论】:
@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)
【讨论】:
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) 结束日期在该范围内的事件
B) 开始日期在该范围内的事件
C) 开始日期和结束日期都在范围内的事件
D) 开始日期和结束日期超出范围但重叠的事件
Robert 的回答很好,但它没有考虑案例 D,即事件在范围之前开始并在范围之后结束。
【讨论】:
Llya,罗伯茨回答,
SELECT * FROM table WHERE start_date = start_of_range
工作正常,
D) 开始日期和结束日期超出范围但重叠的事件
??
【讨论】: