MySQL сравнение даты и времени - PullRequest
58 голосов
/ 21 октября 2010

Например, следующий запрос работает нормально:

SELECT * 
  FROM quotes 
 WHERE expires_at <= '2010-10-15 10:00:00';

Но, очевидно, выполняется сравнение «строк» ​​- мне было интересно, есть ли встроенная в MySQL функция, которая специально выполняет сравнения «дата / время».

Ответы [ 3 ]

112 голосов
/ 21 октября 2010

... это, очевидно, выполняется сравнение 'string'

Нет - если формат даты / времени соответствует поддерживаемому формату, MySQL выполняет неявное преобразование, чтобы преобразовать значение в DATETIME на основе столбца, с которым оно сравнивается. То же самое происходит с:

WHERE int_column = '1'

... где строковое значение «1» преобразуется в INTeger, поскольку тип данных int_column - INT, а не CHAR / VARCHAR / TEXT.

Если вы хотите явно преобразовать строку в DATETIME, наилучшим выбором будет функция STR_TO_DATE :

WHERE expires_at <= STR_TO_DATE('2010-10-15 10:00:00', '%Y-%m-%d %H:%i:%s')
19 голосов
/ 21 октября 2010

Но, очевидно, выполняется сравнение 'string'

Нет. Строка будет автоматически приведена к значению DATETIME.

См. 11.2. Преобразование типов в оценке выражений.

Когда оператор используется с операндами различных типов, происходит преобразование типов для обеспечения совместимости операндов. Некоторые преобразования происходят неявно. Например, MySQL автоматически конвертирует числа в строки по мере необходимости и наоборот.

0 голосов
/ 10 августа 2016

Я знаю, что он довольно старый, но я только что столкнулся с проблемой, и вот что я видел в документе SQL:

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

Полагаю, лучше использовать STR_TO_DATE, так как они потратили время на создание функции только для этого, а также на тот факт, что я нашел это в документации МЕЖДУ ...

...