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?


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;

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

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'

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)


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"])))

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.


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;


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.


Próbuję to samo, ale nie działa poprawnie, uzyskując losowe dane z uwzględnieniem daty.
Manjeet Kumar Nai
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.