Функция даты Mysql не работает меньше

Мне нужно, чтобы все записи были равными и меньше, чем 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 |
+---------------------+

Пожалуйста, кто-нибудь знает, почему это происходит?

Ответ 1

обведите значение с помощью одной кавычки и, конечно же, оно будет работать

SELECT * 
FROM ctx_bookings 
WHERE DATE(booking_time) <= '2012-12-28' 
ORDER BY id ASC

Ответ 2

Как задокументировано под литералами даты и времени:

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, чтобы немедленно найти все соответствующие записи.

Ответ 3

 SELECT * FROM ctx_bookings WHERE DATE(booking_time)<='2012-12-28' ORDER BY id ASC

попробуйте этого помощника