2010-10-21 7 views
51

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

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

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

ответ

104

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

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

WHERE int_column = '1' 

... где строковое значение "1" преобразуется в Integer, поскольку тип данных int_column «s является 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') 
+7

Если ваш сервер или строки не являются в UTC будьте осторожны, поскольку неявное преобразование происходит с сервером/сеансами time_zone, а не часовым поясом значения, с которым оно сравнивается. Таким образом, строка является той же локальной областью time_zone, даже если вы сравниваете ее с UTC_TIMESTAMP(). – ClearCrescendo

+0

@ClearCrescendo: Хорошая точка, thx. –

18

Но это, очевидно, выполняя «строка» Сравнение

No. строка будет автоматически приводить в значение DATETIME.

См 11.2. Type Conversion in Expression Evaluation.

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

0

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

[Для получения наилучших результатов при использовании МЕЖДУНАРОДНЫМИ значениями даты или времени] используйте CAST() для явного преобразования значений в нужный тип данных. Примеры. Если вы сравниваете DATETIME с двумя значениями DATE, преобразуйте значения DATE в значения DATETIME. Если вы используете строчную константу, такую ​​как «2001-1-1» в сравнении с DATE, введите строку в DATE.

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

Смежные вопросы