У меня есть таблица closures
, которая состоит из времени, когда дело моего клиента закрыт:Сравнение диапазонов DATE полей CurDate() в MySQL без учета
+----+------------+------------+-------------------------------+--------+
| id | start_date | end_date | reason | yearly |
+----+------------+------------+-------------------------------+--------+
| 1 | 2010-12-24 | 2011-01-08 | Holidays | 1 |
| 3 | 2011-01-03 | 2011-01-10 | testing purposes | 1 |
| 5 | 2001-01-01 | 2001-01-10 | A non-yearly event | 0 |
+----+------------+------------+-------------------------------+--------+
Я пытался разработать запрос который проверяет, есть ли какие-либо строки в closures
, где CURDATE() находится в пределах start_date
и end_date
. Суть заключается в том, как игнорировать год, если строка отмечена yearly
= '1'. Вот что я получил до сих пор:
SELECT `id`,`reason`,`start_date`,`end_date`,`yearly` FROM `closures`
WHERE (CURDATE() BETWEEN `start_date` AND `end_date`) /* full date with year is compared */
OR
(
`yearly` = '1' /* look for events marked yearly */
AND
(
(RIGHT(CURDATE() , 5) BETWEEN RIGHT(`start_date` , 5) AND RIGHT(`end_date` , 5)) /* This WORKS for all date ranges marked yearly that do not go through new years */
OR
(RIGHT(CURDATE() , 5) >= RIGHT(`start_date` , 5) AND RIGHT(`start_date` , 5) > RIGHT(`end_date` , 5)) /* This DOES NOT catch date ranges that go through new years */
)
)
Запрос показано выше в таблице, я получаю это:
+----+------------------+------------+------------+--------+
| id | reason | start_date | end_date | yearly |
+----+------------------+------------+------------+--------+
| 3 | testing purposes | 2011-01-03 | 2011-01-10 | 1 |
+----+------------------+------------+------------+--------+
Когда я ожидаю, чтобы получить это:
+----+------------------+------------+------------+--------+
| id | reason | start_date | end_date | yearly |
+----+------------------+------------+------------+--------+
| 1 | Holidays | 2010-12-24 | 2011-01-08 | 1 |
+----+------------------+------------+------------+--------+
| 3 | testing purposes | 2011-01-03 | 2011-01-10 | 1 |
+----+------------------+------------+------------+--------+
Am I по праву отслеживать? Есть ли лучший/более быстрый способ проверки MM-DD значения DATE, чем использование RIGHT()?
Помощь мне так, я не достоин ...
Это работает, за исключением случаев, когда закрытие начинается в конце декабря и отправляется на определенную дату после 1 января. Конкат будет собирать год с даты начала и MM-DD из CURDATE. Поэтому, если диапазон закрытия был с 2001-12-24 по 2002-01-10, если вы запустили запрос сегодня (2012-01-04), это последнее предложение будет вычисляться до '2001-01-04' BETWEEN '2001 -12-24 'AND' 2002-01-10 ', который не сработает. – AndyPerlitch
да, я видел это .. извините. опубликовано до того, как я проверил. никому больше не дано вам ничего, что вы можете принять? – davogotland
Я проверил это полностью. он также работает правильно, если текущая дата «2011-12-29». он возвращает только первую строку в этом случае. – davogotland