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.
2012-12-28 to wyrażenie arytmetyczne, które jest równe 1972. – Barmar