#mysql #date #between
#mysql #Дата #между
Вопрос:
select '2011-02-29' BETWEEN '2011-02-01' AND '2011-03-03'
это возвращает 1. Я думаю, что between не учитывает високосный год. Я хочу ваше мнение по этому поводу?
[ПРАВИТЬ]
SELECT DATE( '2010-04-31' )
возвращает значение NULL;
Но select str_to_date('2010-04-31', '%Y-%m-%d')
это перенастройка даты.
Почему?
Спасибо Venu
Комментарии:
1. я думаю, что это выбор реализации? str_to_date просто не проверяется…
Ответ №1:
вам нужно привести его к дате следующим образом:
SELECT DATE('2011-02-29') BETWEEN DATE('2011-02-01') AND DATE('2011-03-03')
с сайта :
Для достижения наилучших результатов при использовании BETWEEN со значениями даты или времени используйте CAST(), чтобы явно преобразовать значения в желаемый тип данных. Примеры: Если вы сравниваете DATETIME с двумя значениями ДАТЫ, преобразуйте значения ДАТЫ в значения DATETIME. Если вы используете строковую константу, такую как ‘2001-1-1’, для сравнения с ДАТОЙ, приведите строку к ДАТЕ.
Ответ №2:
Проблема в том, что вы сравниваете строки, а не даты. Если вы попытаетесь:
select DATE('2011-02-29') you get a NULL...
Ответ №3:
Вы сравниваете строки … вы должны привести значения (или, по крайней мере, первое) к ДАТЕ
Используйте это:
SELECT DATE('2011-02-29') BETWEEN '2011-02-01' AND '2011-03-03'
Это даст вам значение NULL, потому что дата не является реальной.
SELECT DATE('2008-02-29') BETWEEN '2008-02-01' AND '2008-03-03'
Это даст вам 1 (TRUE), потому что дата является реальной (високосный год)
Ответ №4:
DATE
проверяет достоверность, хотя str_to_date
этого не делает.
mysql> select str_to_date('2010-02-31', '%Y-%m-%d');
---------------------------------------
| str_to_date('2010-02-31', '%Y-%m-%d') |
---------------------------------------
| 2010-02-31 |
---------------------------------------
1 row in set (0.00 sec)
mysql> select str_to_date('2010-04-31', '%Y-%m-%d');
---------------------------------------
| str_to_date('2010-04-31', '%Y-%m-%d') |
---------------------------------------
| 2010-04-31 |
---------------------------------------
1 row in set (0.00 sec)
mysql> select date('2010-02-31');
--------------------
| date('2010-02-31') |
--------------------
| NULL |
--------------------
1 row in set, 1 warning (0.00 sec)
mysql> select date('2010-04-31');
--------------------
| date('2010-04-31') |
--------------------
| NULL |
--------------------
1 row in set, 1 warning (0.00 sec)
ОБНОВЛЕНИЕ, согласно @Aziz, DATE
проверит, является ли дата реальной или нет. Согласно моему тесту, кажется, str_to_date
не проверяется.
Комментарии:
1. SELECT DATE( ‘2010-04-31’) возвращает значение NULL; Но select str_to_date(‘2010-04-31’, ‘%Y-%m-%d’) является датой перенастройки..