MySQL между оператором с датами - PullRequest
2 голосов
/ 10 ноября 2011
select '2011-02-29' BETWEEN '2011-02-01' AND '2011-03-03'‎

это возвращается 1. Я думаю, между не учитывает високосный год.Я хочу, чтобы ваш взгляд на это?

[EDIT]
SELECT DATE( '2010-04-31' ) возвращает значение NULL;
Но select str_to_date('2010-04-31', '%Y-%m-%d') - это дата перенастройки.

Почему?

Спасибо, Вену

Ответы [ 4 ]

3 голосов
/ 10 ноября 2011

вам нужно привести его к дате, например:

SELECT DATE('2011-02-29') BETWEEN DATE('2011-02-01') AND DATE('2011-03-03')

с сайта:

Для получения наилучших результатов при использовании BETWEEN со значениями даты или времени используйте CAST ()явно преобразовать значения в нужный тип данных.Примеры: Если вы сравниваете DATETIME с двумя значениями DATE, преобразуйте значения DATE в значения DATETIME.Если вы используете строковую константу, например '2001-1-1', в сравнении с датой, приведите строку к дате .

2 голосов
/ 10 ноября 2011

Проблема в том, что вы сравниваете строки, а не даты. Если вы попробуете:

select DATE('2011-02-29') you get a NULL...
1 голос
/ 10 ноября 2011

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 голос
/ 10 ноября 2011

Вы сравниваете строки ... вы должны привести значения (или, по крайней мере, первое) к DATE

Используйте это:

 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 (ИСТИНА), потому что дата действительна (високосный год)

...