Jak wybrać dane z zakresu dat w MySQL. Moja datetime
kolumna jest w 24-godzinnym formacie czasu Zulu.
select * from hockey_stats
where game_date between '11/3/2012 00:00:00' and '11/5/2012 23:59:00'
order by game_date desc;
Nie zwraca niczego, pomimo posiadania danych między tymi okresami. Czy muszę wymusić wartości w polach „od” i „do”, aby datetime
wpisać zapytanie?
game_date
?Odpowiedzi:
Musisz zaktualizować format daty:
select * from hockey_stats where game_date between '2012-03-11 00:00:00' and '2012-05-11 23:59:00' order by game_date desc;
źródło
where game_date >= '2012-03-11' and game_date < '2012-05-12'
to najdokładniejszy sposób definiowania zakresu dat i będzie działał dla każdego poziomu dokładności czasu od daty do jednostek poniżej sekundy.Oto prosty sposób korzystania z funkcji daty:
select * from hockey_stats where date(game_date) between date('2012-11-03') and date('2012-11-05') order by game_date desc
źródło
date(game_date)
spowoduje, że porównanie zostanie przeprowadzone z obliczoną wartością , a nie z polem - co skutkuje brakiem użycia indeksu i dotknięciem każdego wiersza (tj. pełnym skanowaniem tabeli)!game_date
. Nawet bez indeksu tabela musiałaby mieć umiarkowane rozmiary, aby można było zauważyć zauważalną różnicę w wydajności. Coś w nazwiehockey_stats
sugeruje mi, że nie jest to naprawdę duży stół.Prosty sposób:
select * from hockey_stats where game_date >= '2012-03-11' and game_date <= '2012-05-11'
źródło
Prawdopodobnie musisz użyć funkcji STR_TO_DATE :
select * from hockey_stats where game_date between STR_TO_DATE('11/3/2012 00:00:00', '%c/%e/%Y %H:%i:%s') and STR_TO_DATE('11/5/2012 23:59:00', '%c/%e/%Y %H:%i:%s') order by game_date desc;
(jeśli data_gry to ciąg, może być konieczne użycie na nim STR_TO_DATE)
źródło
Format daty MySQL jest następujący: YMD. Używasz Y / M / D. To jest złe. zmodyfikuj zapytanie.
Jeśli wstawisz datę, taką jak Y / M / D, zostanie wstawiona wartość null w bazie danych.
Jeśli korzystasz z PHP, a data, którą otrzymujesz z formularza, jest taka, jak ta Y / M / D, możesz to zastąpić za pomocą instrukcji.
źródło
W prosty sposób można go zapytać jako
select * from hockey_stats where game_date between '2018-01-01' and '2018-01-31';
Działa to, jeśli czas nie jest problemem.
Biorąc pod uwagę czas, postępuj w następujący sposób:
select * from hockey_stats where (game_date between '2018-02-05 01:20:00' and '2018-02-05 03:50:00');
Zauważ, że dotyczy to serwera MySQL.
źródło
Możesz użyć funkcji użytkownika STR_TO_DATE i przekazać własne parametry daty w oparciu o opublikowany format:
select * from hockey_stats where game_date between STR_TO_DATE('11/3/2012 00:00:00', '%c/%e/%Y %H:%i:%s') and STR_TO_DATE('11/5/2012 23:59:00', '%c/%e/%Y %H:%i:%s') order by game_date desc;
Lub po prostu użyj formatu, który MySQL obsługuje daty RRRR: MM: DD HH: mm: SS i wprowadź zapytanie jako
select * from hockey_stats where game_date between '2012-03-11 00:00:00' and'2012-05-11 23:59:00' order by game_date desc;
źródło
Musisz szukać daty i bronić tego, w jaki sposób wstawiasz dane game_date do swojej bazy danych ... na przykład, jeśli wstawiłeś wartość daty jako datę długą lub krótką.
SELECT * FROM hockey_stats WHERE game_date >= "6/11/2018" AND game_date <= "6/17/2018"
Możesz również użyć BETWEEN :
SELECT * FROM hockey_stats WHERE game_date BETWEEN "6/11/2018" AND "6/17/2018"
proste.
źródło