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.