Я читал, как я могу запросить между двумя датами здесь, но я пытаюсь сделать наоборот. У меня есть база данных событий, с начальными и конечными днями. Я пытаюсь проверить, находится ли сейчас() между начальными и конечными днями.
Отметим, что мои события цикличны, поэтому мне не нужны годы. Чтобы использовать формат данных в моей базе данных, я просто использую 2000 для всего. У меня такие события, как рождественский сезон (2000-12-01 - 2000-12-25), День независимости (2000-06-25 - 2000-07-04) и т.д.
Сначала я думал о том, чтобы сделать что-то вроде:
SELECT * FROM 'table' WHERE MONTH(NOW()) >= MONTH('start') AND DATE(NOW()) >= DATE('start') AND MONTH(NOW()) <= MONTH('end') AND DATE(NOW()) <= DATE('end')
Но затем я осознал серьезный недостаток в периоды времени, охватывающий несколько месяцев. Если сегодня 27JUN, я бы хотел, чтобы строка дня независимости вернулась, но в то время как 27> = 25, 27 <= 4 не так.
Я думал о том, могу ли я конвертировать NOW(), начать и заканчивать временную метку, чтобы позволить мне сравнивать их, но уклонился от этой идеи, потому что у меня могло быть что-то с датой начала 2000-12-26 и датой окончания 2000-01-01 (помня, что я игнорирую год).
Есть ли лучший способ хранить пары месяц/дата вместо дат? Или что я могу сделать, чтобы исправить мой запрос к базе данных?
Текущая дата должна быть скорректирована до 2000 года, прежде чем сравнивать даты начала и окончания. Если дата окончания - до даты начала, год окончания - фактически год после даты начала. Попробуй это:
SELECT * from 'table'
WHERE
('end' >= 'start' AND
DATE_ADD(CURDATE(), INTERVAL 2000-YEAR(CURDATE()) YEAR)
BETWEEN 'start' AND 'end')
OR
('end' < 'start' AND
DATE_ADD(CURDATE(), INTERVAL 2000-YEAR(CURDATE()) YEAR)
BETWEEN 'start' and DATE_ADD('end', INTERVAL 1 YEAR))
ИЛИ ЖЕ:
SELECT * from 'table'
WHERE
CASE
WHEN 'end' >= 'start' THEN
DATE_ADD(CURDATE(), INTERVAL 2000-YEAR(CURDATE()) YEAR) BETWEEN 'start' AND 'end'
ELSE
DATE_ADD(CURDATE(), INTERVAL 2000-YEAR(CURDATE()) YEAR) BETWEEN 'start' and DATE_ADD('end', INTERVAL 1 YEAR)
END
Используйте CURDATE() вместо NOW() cos NOW() имеет компонент времени, который не нужен.
SELECT * FROM table WHERE CURDATE() between dateStart and dateEnd
где dateStart
- это ваша прошлая дата и dateEnd
- ваша будущая дата
NOW() BETWEEN start and end
? Я что-то здесь упускаю?