Mam kolumnę typu „datetime” o wartościach takich jak 2009-10-20 10:00:00
Chciałbym wyodrębnić datę z daty i godziny i napisać zapytanie takie jak:
SELECT * FROM
data
WHERE datetime = '2009-10-20'
ORDER BY datetime DESC
Czy najlepszy sposób to zrobić?
SELECT * FROM
data
WHERE datetime BETWEEN('2009-10-20 00:00:00' AND '2009-10-20 23:59:59')
ORDER BY datetime DESC
Zwraca to jednak pusty zestaw wyników. Jakieś sugestie?
Korzystanie
WHERE DATE(datetime) = '2009-10-20'
ma problemy z wydajnością . Jak stwierdzono tutaj :DATE()
wszystkie wiersze, w tym te, które nie pasują.Użyj
BETWEEN
lub>
,<
,=
operatorów, które pozwalają korzystać z indeksu:Aktualizacja: wpływ na wykorzystaniu
LIKE
zamiast operatorów w kolumnie indeksowanej jest wysoka . Oto niektóre wyniki testu dla tabeli zawierającej 1 176 000 wierszy:datetime LIKE '2009-10-20%'
=> 2931msdatetime >= '2009-10-20 00:00:00' AND datetime <= '2009-10-20 23:59:59'
=> 168msPrzy drugim wywołaniu tego samego zapytania różnica jest jeszcze większa: 2984ms vs 7ms (tak, tylko 7 milisekund!). Znalazłem to podczas przepisywania starego kodu w projekcie przy użyciu Hibernacji.
źródło
DATE(datetime)
abyBETWEEN AND
zachowywać się w scenach, otrzymujemy krótkie oświadczenie i świetną wydajność. Dlaczego nie? Dlaczego tego nie zrobili? :)DATE(datetime) in (:list)
nie działa zBETWEEN
Możesz sformatować datę / godzinę do części YMD:
źródło
DATE_FORMAT(datetime, '%H:%i:%S')
Chociaż wszystkie odpowiedzi na stronie zwrócą pożądany wynik, wszystkie mają problemy z wydajnością. Nigdy nie wykonuj obliczeń na polach w
WHERE
klauzuli (w tymDATE()
obliczeń), ponieważ obliczenia te należy wykonać dla wszystkich wierszy w tabeli.BETWEEN ... AND
Konstrukt jest łącznie dla obu warunków granicznych, wymagające jednego określić składnię 23:59:59 datą końcową, która sama ma inne problemy (transakcje mikrosekund, co wierzę MySQL nie wspiera w 2009 roku, kiedy pytano).Właściwym sposobem zapytania o
timestamp
pole MySQL dla określonego dnia jest sprawdzenie, czy wartość „Większa niż równa się” z żądaną datą, czy „mniejsza niż” dla następnego dnia, bez określonej godziny.Jest to najszybsza metoda z najmniejszą ilością pamięci i najmniejszym zużyciem zasobów, a ponadto obsługuje wszystkie funkcje MySQL i przypadki narożne, takie jak precyzja znaczników czasu w sekundach. Dodatkowo jest to zabezpieczenie na przyszłość.
źródło
Oto wszystkie formaty
Powiedzmy, że jest to kolumna zawierająca
datetime
wartość, tabeladata
.źródło
Możesz użyć:
Lub:
Lub:
źródło
prosty i najlepszy sposób na użycie funkcji daty
przykład
LUB
źródło
Cóż, użycie
LIKE
instrukcji in jest najlepszą opcją,WHERE datetime LIKE '2009-10-20%'
która powinna działać w tym przypadkuźródło