Ответ 1
обведите значение с помощью одной кавычки и, конечно же, оно будет работать
SELECT *
FROM ctx_bookings
WHERE DATE(booking_time) <= '2012-12-28'
ORDER BY id ASC
Мне нужно, чтобы все записи были равными и меньше, чем 2012-12-28. Я использовал следующий запрос для этого, booking_time - это поле DATETIME, а записи меньше 2012-12-28, но он возвращает нулевые строки. кто-нибудь имеет идею?
SELECT * FROM ctx_bookings WHERE DATE(booking_time)<=2012-12-28 ORDER BY id ASC
Представленная таблица
+---------------------+
| booking_time |
+---------------------+
| 2012-12-20 03:10:09 |
| 2012-12-25 02:10:04 |
+---------------------+
Пожалуйста, кто-нибудь знает, почему это происходит?
обведите значение с помощью одной кавычки и, конечно же, оно будет работать
SELECT *
FROM ctx_bookings
WHERE DATE(booking_time) <= '2012-12-28'
ORDER BY id ASC
Как задокументировано под литералами даты и времени:
MySQL распознает значения
DATE
в следующих форматах:
В виде строки в
'YYYY-MM-DD'
или'YY-MM-DD'
. Разрешается использовать "смягченный" синтаксис: в качестве разделителя между частями даты может использоваться любой знак пунктуации. Например,'2012-12-31'
,'2012/12/31'
,'2012^12^31'
и'[email protected]@31'
эквивалентны.Как строка без разделителей в формате
'YYMMDD'
'YYYYMMDD'
или'YYMMDD'
, при условии, что строка имеет смысл в качестве даты. Например,'20070523'
и'070523'
интерпретируются как'2007-05-23'
, но'071332'
является недопустимым (содержит бессмысленные части месяца и дня) и становится'0000-00-00'
.Как число в формате
YYYYMMDD
илиYYMMDD
формате, при условии, что число имеет смысл в качестве даты. Например,19830905
и830905
интерпретируются как'1983-09-05'
.
Как прокомментировал @Barmar, ваше буквальное выражение 2012-12-28
оценивается как арифметическое (2012 - 12) - 28
, что равно 1 972.
За @JW. ответ, вы можете заключить это выражение в кавычки, чтобы получить действительный литерал даты (первой формы, выше). В качестве альтернативы:
в то же время цитируя литерал, вы можете использовать любой другой знак пунктуации (или даже отсутствие символа) в качестве разделителя между частями даты:
WHERE DATE(booking_time) <= '2012_12_28'
WHERE DATE(booking_time) <= '20121228'
Вы можете удалить разделители и оставить буквальное выражение без кавычек:
WHERE DATE(booking_time) <= 20121228
Также обратите внимание, что использование такого критерия фильтра, который использует функцию (в данном случае, функцию DATE()
) над столбцом, требует полного сканирования таблицы, чтобы оценить эту функцию - поэтому он не получит никаких индексов. Более подходящей альтернативой будет более явная фильтрация по диапазону значений столбцов (т.е. времен), которые удовлетворяют вашим критериям:
WHERE booking_time < '2012-12-28' + INTERVAL 1 DAY
Это эквивалентно, потому что любое время, которое выпадает строго до следующего дня, обязательно произойдет в день интереса или до него. Это возможно, потому что столбец сравнивается с константным выражением (результат операции +
является детерминированным), и, следовательно, можно просмотреть индекс по параметру booking_time
, чтобы немедленно найти все соответствующие записи.
SELECT * FROM ctx_bookings WHERE DATE(booking_time)<='2012-12-28' ORDER BY id ASC
попробуйте этого помощника