Próbuję wybrać tylko dzisiejsze rekordy z tabeli bazy danych.
Obecnie używam
SELECT * FROM `table` WHERE (`timestamp` > DATE_SUB(now(), INTERVAL 1 DAY));
Ale to wymaga wyników z ostatnich 24 godzin i potrzebuję tylko do wybrania wyników z dnia dzisiejszego, ignorując czas. Jak mogę wybrać wyniki tylko na podstawie daty?
Using where; Using index
?timestamp
(idate
tak jak w moim przypadku) jest zastrzeżonym słowem MySQLJeśli chcesz, aby indeks był używany, a zapytanie nie skanowało tabeli:
Aby pokazać, jaką różnicę ma to w rzeczywistych planach wykonania, przetestujemy za pomocą SQL-Fiddle (niezwykle pomocna witryna):
Wypróbujmy teraz 2 wersje.
Wersja 1 z
DATE(timestamp) = ?
Wyjaśnić:
To filtruje wszystkie (6671), wiersze, a następnie robi filesort (nie jest to problem, ponieważ zwrócone wiersze są nieliczne)
Wersja 2 z
timestamp <= ? AND timestamp < ?
Wyjaśnić:
Używa skanowania zakresu w indeksie , a następnie odczytuje tylko odpowiednie wiersze z tabeli.
źródło
INDEX t_IX (timestamp, id)
mógłby (powinien?) być po prostuINDEX t_IX (timestamp)
, ponieważ klucz podstawowy jest implikowany w indeksie. czy jest jakiś powód, dla którego tego nie rozumiem? wypróbowałem to w sql-fiddle i zobaczyłem ten sam (lepszy) plan wykonaniaid
(ponieważ jest to PK, a tym samym indeks klastrowy tabeli) i tak jest dołączany do indeksu. Tak więc nie zaszkodzi jawne dodanie go (i może wychwycić pewne martwe punkty optymalizatora). Z pewnością nie ma to znaczenia w tym przypadku / zapytaniu.timestamp < CURDATE() + INTERVAL 1 DAY
jest to konieczne?jest krótszy, nie ma potrzeby używania „AND timestamp <CURDATE () + INTERVAL 1 DAY”
ponieważ CURDATE () zawsze zwraca bieżący dzień
Funkcja MySQL CURDATE ()
źródło
Na ile sposobów możemy oskórować tego kota? Oto kolejny wariant.
SELECT * FROM
table
WHERE DATE (FROM_UNIXTIME (timestamp
)) = '2015-11-18';źródło
Jeśli chcesz porównać z konkretną datą, możesz bezpośrednio napisać w ten sposób:
// tutaj znacznik czasu to nazwa kolumny, której typ to znacznik czasu
lub
Do pobrania dzisiejszej daty dostępna jest funkcja CURDATE (), więc:
źródło
Po prostu rzuć to na randkę:
źródło
To mogłoby być moim zdaniem najłatwiejsze:
źródło
Lub możesz użyć alternatywy CURRENT_DATE, z takim samym wynikiem:
Przykłady z database.guide
źródło
W Visual Studio 2017, korzystając z wbudowanej bazy danych do programowania, miałem problemy z aktualnie podanym rozwiązaniem, musiałem zmienić kod, aby działał, ponieważ wyrzucał błąd, że DATE () nie jest funkcją wbudowaną.
Oto moje rozwiązanie:
where CAST(TimeCalled AS DATE) = CAST(GETDATE() AS DATE)
źródło