База данных запросов, чтобы увидеть, если сейчас между двумя датами

0

Я читал, как я могу запросить между двумя датами здесь, но я пытаюсь сделать наоборот. У меня есть база данных событий, с начальными и конечными днями. Я пытаюсь проверить, находится ли сейчас() между начальными и конечными днями.

Отметим, что мои события цикличны, поэтому мне не нужны годы. Чтобы использовать формат данных в моей базе данных, я просто использую 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 (помня, что я игнорирую год).

Есть ли лучший способ хранить пары месяц/дата вместо дат? Или что я могу сделать, чтобы исправить мой запрос к базе данных?

  • 0
    Что не так с NOW() BETWEEN start and end ? Я что-то здесь упускаю?
  • 0
    @TimBiegeleisen - часть «мои события цикличны, поэтому мне нет дела до года» - они хотят найти это независимо от года.
Теги:

2 ответа

1
Лучший ответ

Текущая дата должна быть скорректирована до 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() имеет компонент времени, который не нужен.

0

SELECT * FROM table WHERE CURDATE() between dateStart and dateEnd

где dateStart - это ваша прошлая дата и dateEnd - ваша будущая дата

  • 0
    К сожалению, это не дает никаких результатов, так как учитывает год, а 2018 год уже далеко за 2000 годом.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню