Bir tarih / saat aralığı arasındaki verileri seçin


83

MySQL'de bir tarih aralığı arasındaki verileri nasıl seçerim. Benim datetimesütun 24 saatlik Zulu zaman biçiminde olduğunu.

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;

Bu dönemler arasında veri olmasına rağmen hiçbir şey döndürmez. 'Kimden' ve 'kime' alanlarındaki değerleri datetimesorguyu yazmaya zorlamam gerekir mi?


Veri türü ne için game_date?
hjpotter92

1
tarih saati. Sanırım neden kafamın karıştığını anladım. Mysql için kurbağa yazılımı kullanıyorum ve varsayılan olarak tarihleri ​​tarih aralığımda kullandığım biçimde işliyor, bu yüzden aynısını kullandım. Yani sorun, aralığımda verdiğim tarihin biçimiydi.
codingknob

Eugen Rieck tarafından sağlanan biçimi kullanırsam, beklendiği gibi çalışır.
codingknob

Yanıtlar:


144

Tarih formatını güncellemeniz gerekiyor:

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
hangisi tarih ve buradaki ay hangisi?
Arun

8
Bir tarih bilgisinin biçimi 'YYYY-AA-GG SS: dd: SS' şeklindedir
Eugen Rieck

13
BETWEEN'i kullanmak en iyi uygulama DEĞİLDİR, özellikle MySQL artık saniyenin altında bir zaman hassasiyetini desteklediğinden . 23:59:59 kullanmak, bir günün sonundan tam bir saniye kısadır. where game_date >= '2012-03-11' and game_date < '2012-05-12'bir tarih aralığı tanımlamanın en kesin yoludur ve tarihten saniyenin altındaki birimlere kadar her türlü zaman hassasiyeti için çalışacaktır.
Used_By_Al Zaten

3
@Used_By_Already Buna 2013'te yanıt verildiğinde, saniyenin altında MySQL yoktu - henüz 23:59 ile 00:00 arasında başlayıp saniyenin altında bir başlangıç ​​zamanıyla başlayan bir hokey oyunu duymadım.
Eugen Rieck

5
MySQL sürümlerini saniyenin altında bir hassasiyetle kullanan okuyucular için bu yorumu bıraktım. MySQL sürüm 5.6.4 veya üstü, kesirli saniyeleri destekler. (Tarih aralığının hangi spor veya amaç için olduğu ile ilgili.)
Used_By_Al Zaten

19

İşte tarih işlevini kullanmanın basit bir yolu:

select *
from hockey_stats
where date(game_date) between date('2012-11-03') and date('2012-11-05')
order by game_date desc

7
Kör müyüm yoksa bu bir performans katili mi? date(game_date)karşılaştırmanın bir alana değil, hesaplanmış bir değere karşı çalıştırılmasına sahip olacaktır - sonuç olarak indeks kullanılmaz ve her satıra dokunulur (yani tam tablo taraması)!
Eugen Rieck

1
@EugenRieck. . . Üzerinde bir indeks olduğunu varsayarak genel olarak haklısınız game_date. Bir indeks olmasa bile, performansta gözle görülür bir fark için tablonun orta büyüklükte olması gerekir. İsimle ilgili bir şey hockey_statsbana bunun gerçekten büyük bir masa olmadığını gösteriyor.
Gordon Linoff

8

Basit bir yol:

select  * from  hockey_stats 
where  game_date >= '2012-03-11' and game_date  <= '2012-05-11'

5

Muhtemelen STR_TO_DATE işlevini kullanmanız gerekir :

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;

(game_date bir dizeyse, üzerinde STR_TO_DATE kullanmanız gerekebilir)


4

MySQL tarih biçimi şudur: YMD. Y / M / D kullanıyorsunuz. Bu yanlış. sorgunuzu değiştirin.

Tarihi Y / A / G gibi eklerseniz, veritabanına boş değer girecektir.

PHP kullanıyorsanız ve formdan aldığınız tarih bu Y / A / D gibiyse, bunu ifadeyi kullanarak değiştirebilirsiniz.

out_date=date('Y-m-d', strtotime(str_replace('/', '-', $data["input_date"])))

4

Basit bir şekilde şu şekilde sorgulanabilir:

select * from hockey_stats 
where game_date between '2018-01-01' and '2018-01-31';

Bu, zaman önemli değilse işe yarar.

Zamanı göz önünde bulundurarak da şu şekilde takip edin:

select * from hockey_stats where (game_date between '2018-02-05 01:20:00' and '2018-02-05 03:50:00');

Bunun MySQL sunucusu için olduğunu unutmayın.


2

Kullanıcı STR_TO_DATE işlevini kullanabilir ve gönderdiğiniz biçime bağlı olarak kendi tarih parametrelerinizi iletebilirsiniz:

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;

Veya MySQL'in YYYY: MM: DD HH: mm: SS tarihlerini işlediği biçimi kullanın ve sorguyu şu şekilde yapın:

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

Bu game_date verilerini veritabanınıza nasıl ekleyeceğinize dair tarih savunmasını aramalısınız. Örneğin, tarih değerini uzun veya kısa tarihe eklediyseniz.

SELECT * FROM hockey_stats WHERE game_date >= "6/11/2018" AND game_date <= "6/17/2018"

Ayrıca BETWEEN'i de kullanabilirsiniz :

SELECT * FROM hockey_stats WHERE game_date BETWEEN "6/11/2018" AND "6/17/2018"

bu kadar basit.


Ben de aynı şekilde deniyorum, ancak düzgün çalışmıyor, rastgele tarihe dayalı veriler alıyor.
Manjeet Kumar Nai
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.