Mam tabelę zawierającą kolumnę z datą i godziną. Chcę zwrócić wszystkie rekordy z danego dnia niezależnie od godziny. Innymi słowy, jeśli moja tabela zawiera tylko następujące 4 rekordy, to tylko 2 i 3 zostaną zwrócone, jeśli ograniczę się do 2012-12-25.
2012-12-24 00:00:00
2012-12-25 00:00:00
2012-12-25 06:00:00
2012-12-26 05:00:00
Odpowiedzi:
NIGDY NIGDY nie używaj takiego selektora
DATE(datecolumns) = '2012-12-24'
- to zabójca wydajności:DATE()
dla wszystkich wierszy, w tym tych, które nie pasująJest znacznie szybszy w użyciu
ponieważ pozwoli to na użycie indeksu bez obliczeń.
EDYTOWAĆ
Jak wskazał Used_By_Already, w czasie od pierwszej odpowiedzi w 2012 r. Pojawiły się wersje MySQL, w których używanie „23: 59: 59” jako końca dnia nie jest już bezpieczne. Zaktualizowana wersja powinna przeczytać
Istota odpowiedzi, tj. Unikanie selektora na wyliczonym wyrażeniu, oczywiście pozostaje aktualna.
źródło
WHERE col >= '2012-12-25' AND col < '2012-12-25' + INTERVAL 1 DAY
. Unika 0 czas i działa naDATE
,DATETIME
,DATETIME(6)
, itd. I zajmuje się LEAP dzień itp... WHERE date_column >='2012-12-25' AND date_column <'2012-12-26'
może potencjalnie działać lepiej (jeśli masz indeks na kolumnie_data) niżDATE
.źródło
BETWEEN
rozwiązanie ... ktoś bechmarked?BETWEEN
to tylko sposób na pisaniefield >= value1 and fied<= value2
.Możesz użyć
%
:źródło