Как я могу проверить, находится ли дата в диапазоне в MySQL? - PullRequest
1 голос
/ 05 апреля 2011

Почему я получаю разные результаты для подобных запросов?

SELECT CASE WHEN CONCAT(2011, '-1-1') BETWEEN '2011-01-01' AND '2011-03-31' THEN 1 ELSE 0 END AS status;
+--------+
| status |
+--------+
|      0 |
+--------+  

SELECT CASE WHEN CONCAT(2011, '-1-1') BETWEEN '2011-1-1' AND '2011-3-31' THEN 1 ELSE 0 END AS status;
+--------+
| status |
+--------+
|      1 |
+--------+

Ответы [ 3 ]

1 голос
/ 05 апреля 2011

Поскольку вы сравниваете строки, а не даты.

Самый простой способ превратить строку в дату - это заключить в DATE ().

SELECT CASE WHEN DATE(CONCAT(2011, '-1-1'))
            BETWEEN DATE('2011-1-1') AND DATE('2011-3-31')
            THEN 1 ELSE 0 END AS status;

http://dev.mysql.com/doc/refman/5.0/en/datetime.html

Вы также можете сделать свой запрос короче, поскольку MySQL возвращает логическое значение равным 1/0.

SELECT DATE(CONCAT(2011, '-1-1'))
            BETWEEN DATE('2011-1-1') AND DATE('2011-3-31') as status;
1 голос
/ 05 апреля 2011

Потому что это делает сравнение строк.Вы должны использовать функцию mysl date .

 SELECT CASE WHEN date(CONCAT(2011, '-1-1')) BETWEEN date('2011-1-1') AND date('2011-3-31') THEN 1 ELSE 0 END AS status;
1 голос
/ 05 апреля 2011

Вы сравниваете строки, а не даты. Попробуйте явно привести к желаемому типу данных:

SELECT CASE WHEN CAST(CONCAT(2011, '-1-1') AS DATETIME) BETWEEN CAST('2011-01-01' AS DATETIME) AND CAST('2011-03-31' AS DATETIME) THEN 1 ELSE 0 END AS status;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...