Сравнение mysql datetime
Например, следующий запрос работает нормально:
SELECT *
FROM quotes
WHERE expires_at <= '2010-10-15 10:00:00';
Но это, очевидно, сравнение "string" - мне было интересно, есть ли функция, встроенная в MySQL, которая специально выполняет сравнения "datetime".
Ответы
Ответ 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...