Подтвердить что ты не робот

Сравнение mysql datetime

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

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

Но это, очевидно, сравнение "string" - мне было интересно, есть ли функция, встроенная в MySQL, которая специально выполняет сравнения "datetime".

4b9b3361

Ответ 1

... это, очевидно, выполняет сравнение "строк" ​​

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

WHERE int_column = '1'

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

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

WHERE expires_at <= STR_TO_DATE('2010-10-15 10:00:00', '%Y-%m-%d %H:%i:%s')

Ответ 2

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

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

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

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

Ответ 3

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

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

Я предполагаю, что лучше использовать STR_TO_DATE, так как они нашли время, чтобы сделать функцию только для этого, а также тот факт, что я нашел это в документе BETWEEN...