Wybierz dane z zakresu dat / godzin

83

Jak wybrać dane z zakresu dat w MySQL. Moja datetimekolumna 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 datetimewpisać zapytanie?

codingknob
źródło
Do czego służy typ danych game_date?
hjpotter92
1
jego data i godzina. Myślę, że odkryłem, dlaczego byłem zdezorientowany. Używam oprogramowania ropucha dla mysql i domyślnie renderuje daty w formacie, którego użyłem w moim zakresie dat, dlatego użyłem tego samego. Problem polegał więc na formacie daty, którą podałem w swoim asortymencie.
codingknob
Jeśli używam formatu dostarczonego przez Eugena Riecka, działa zgodnie z oczekiwaniami.
codingknob

Odpowiedzi:

144

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;
Eugen Rieck
źródło
2
która jest datą, a która miesiącem?
Arun
8
Format literału daty to „RRRR-MM-DD HH: mm: SS”
Eugen Rieck,
13
Używanie opcji BETWEEN NIE jest najlepszą praktyką, zwłaszcza że MySQL obsługuje teraz precyzję poniżej sekundy . Czas 23:59:59 to jedna pełna sekunda krótsza od końca dnia. 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.
Used_By_Already
3
@Used_By_Already Gdy odpowiedź na to pytanie pojawiła się w 2013 r., Nie było MySQL z subsekundą - i jeszcze nie słyszałem o meczu hokejowym rozpoczynającym się między 23:59 a 00:00 z czasem rozpoczęcia poniżej sekundy.
Eugen Rieck,
5
Ten komentarz zostawiłem dla czytelników używających wersji MySQL z precyzją poniżej sekundy. MySQL w wersji 5.6.4 lub nowszej obsługuje ułamki sekund. (Bez względu na sport lub cel, dla którego jest przeznaczony zakres dat).
Used_By_Already
19

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
Gordon Linoff
źródło
7
Czy jestem ślepy, czy to zabójca wydajności? 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)!
Eugen Rieck
1
@EugenRieck. . . Ogólnie masz rację, zakładając, że istnieje indeks 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 nazwie hockey_statssugeruje mi, że nie jest to naprawdę duży stół.
Gordon Linoff
8

Prosty sposób:

select  * from  hockey_stats 
where  game_date >= '2012-03-11' and game_date  <= '2012-05-11'
zrazy
źródło
5

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)

fthiella
źródło
4

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.

out_date=date('Y-m-d', strtotime(str_replace('/', '-', $data["input_date"])))
Hafiz Shehbaz Ali
źródło
4

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.

Mithun Theertha
źródło
2

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;

stackFan
źródło
2

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.

ramber
źródło
Próbuję to samo, ale nie działa poprawnie, uzyskując losowe dane z uwzględnieniem daty.
Manjeet Kumar Nai