it-swarm.com.ru

Функция даты 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 |
+---------------------+

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

12
Gihan Dilusha

оберните значение одинарной кавычкой, и оно обязательно сработает

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

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

MySQL распознает DATE значения в следующих форматах:

  • В виде строки в формате 'YYYY-MM-DD' или 'YY-MM-DD'. Разрешен «расслабленный» синтаксис: любой знак пунктуации может использоваться в качестве разделителя между частями даты. Например, '2012-12-31', '2012/12/31', '2012^12^31' и '[email protected]@31' эквивалентны.

  • Как строка без разделителей в формате '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()) над столбцом, требуется полное сканирование таблицы для оценки этой функции - поэтому он не получит выгоды от каких-либо индексов. Более подходящей альтернативой будет более явная фильтрация по диапазону значений столбцов (т.е. times), которые удовлетворяют вашим критериям:

WHERE booking_time < '2012-12-28' + INTERVAL 1 DAY

Это эквивалентно, потому что любое время, которое выпадает строго до следующего дня, обязательно произойдет в день интереса или до него. Это возможно, потому что столбец сравнивается с константным выражением (результат операции + является детерминированным), и поэтому индекс через booking_time может быть пройден, чтобы немедленно найти все соответствующие записи.

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

попробуй этого приятеля 

1
Nipun Jain