2012-12-27 13 views
10

Potrzebuję uzyskać wszystkie rekordy, które są równe i mniej niż 2012-12-28 Użyłem do tego poniższego zapytania, booking_time jest polem DATETIME i są zapisy mniej niż 2012-12- 28, ale zwraca zero wierszy. czy ktoś ma pomysł?Funkcja daty Mysql nie działa za mniej niż

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

Tabela złożony

+---------------------+ 
| booking_time  | 
+---------------------+ 
| 2012-12-20 03:10:09 | 
| 2012-12-25 02:10:04 | 
+---------------------+ 

Proszę ktoś wie dlaczego tak się dzieje?

+2

2012-12-28 to wyrażenie arytmetyczne, które jest równe 1972. – Barmar

Odpowiedz

31

owinąć wartość za pomocą pojedynczego cudzysłowu i na pewno będzie działać

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

Oh.Damn .. dzięki stary .. –

+0

nie ma za co. ': D' –

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

spróbować tej Mate

+0

Dzięki kolego, to działa :) –

7

jak udokumentowano pod Date and Time Literals:

MySQL rozpoznaje DATE wartości w tych formatach:

  • jako ciąg w formacie albo 'YYYY-MM-DD' lub 'YY-MM-DD'. Dopuszczalna jest "luźna" składnia: dowolny znak interpunkcyjny może być użyty jako ogranicznik między częściami daty. Na przykład: '2012-12-31', '2012/12/31', '2012^12^31' i '[email protected]@31' są równoważne.

  • Jako ciąg bez ograniczników w formacie 'YYYYMMDD' lub 'YYMMDD', pod warunkiem, że ciąg ma sens jako data. Na przykład '20070523' i '070523' są interpretowane jako '2007-05-23', ale '071332' jest niedozwolony (ma nonsensowne części miesiąca i dnia) i staje się '0000-00-00'.

  • Jako liczba w formacie YYYYMMDD lub YYMMDD, pod warunkiem, że liczba ma sens jako data. Na przykład 19830905 i 830905 są interpretowane jako '1983-09-05'.

Jak @Barmar commented, swoim dosłownym wyrażeniem 2012-12-28 oceniana jest jako średnia arytmetyczna (2012 - 12) - 28, co równa się 1,978.

Na @JW.'s answer można zacytować to wyrażenie, aby uzyskać poprawną literalną datę (pierwszego formularza, powyżej).Alternatywnie:

  • przy jednoczesnym cytowanie dosłowne, można użyć dowolny inny znak interpunkcyjny (lub nawet nie ma charakteru) jako separatora pomiędzy datą części:

    WHERE DATE(booking_time) <= '2012_12_28' 
    WHERE DATE(booking_time) <= '20121228' 
    
  • można zdjąć ograniczniki i pozostawienia Twój dosłowne unquoted:

    WHERE DATE(booking_time) <= 20121228 
    

Należy również zauważyć, że przy użyciu FiLt Takie kryterium, które używa funkcji (w tym przypadku funkcji DATE()) w kolumnie, wymaga pełnego skanowania tabeli w celu oceny tej funkcji - dlatego nie będzie korzystać z żadnych indeksów. Bardziej sargable alternatywą byłoby filtrować bardziej wyraźnie w całym zakresie wartości kolumn (tj razy), które spełniają kryteria:

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

Jest to równoważne ponieważ za każdym razem, że spada surowo przed następnego dnia będzie koniecznie miały miejsce w dniu zainteresowania lub przed nim. Jest on sargable, ponieważ kolumna jest porównywana ze stałym wyrażeniem (wynik determinująca jest operacją +) i dlatego można przetransportować indeks ponad booking_time, aby od razu znaleźć wszystkie pasujące rekordy.

Powiązane problemy