mysql между оператором с датами

#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’) является датой перенастройки..