Существуют ли какие-либо функции MySQL для получения всех строк с начальной или конечной датой, которые находятся между данной начальной и конечной датой? - PullRequest
8 голосов
/ 10 ноября 2008

У меня есть таблица событий с записанным временем начала и окончания в качестве объекта MySQL DATETIME (в формате YYYY-MM-DD HH:MM:SS. Я хочу найти все события, которые происходят в определенном диапазоне дат. Однако события могут охватывать несколько дней (и выйти за пределы моего диапазона дат, но я хочу вернуть их, если они даже перекрываются на 1 секунду или более с моим диапазоном дат).

Предложения

Ответы [ 5 ]

17 голосов
/ 10 ноября 2008

Это найдет каждое событие, которое полностью содержится внутри диапазона:

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
7 голосов
/ 10 ноября 2008

Ответы @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)

3 голосов
/ 10 ноября 2008
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'

Это поможет избежать ошибок, когда даты совпадают, но ваше время попадает в интервал на несколько часов, минут или секунд.

1 голос
/ 10 ноября 2008

По сути, вы можете использовать регулярные сравнения - приведенные выше должны работать - хитрость заключается в проверке всех возможных случаев.

A) события с датой окончания в диапазоне

B) события с начальной датой в диапазоне

C) события с датами начала и окончания в диапазоне

D) события с датами начала и окончания за пределами диапазона, но с перекрытием

Ответ Роберта хороший, но он не учитывает случай D, когда событие начинается до диапазона и заканчивается после диапазона.

0 голосов
/ 16 декабря 2008

Лля, Робертс отвечает,

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

отлично работает с

D) события с датами начала и окончания за пределами диапазона, но с перекрытием

??

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...