MySQL, DATE dizesini DATETIME alanındaki dizeyle karşılaştırır


93

Bir sorum var: Bir DATE "2010-04-29" dizesini DATETIME (2010-04-29 10:00) olarak depolanan dizelerle karşılaştırarak MySQL veritabanından seçim yapmak mümkün mü?

Verileri filtreleyen bir tarih seçicim var ve şu şekilde DATETIME alanına göre tabloyu sorgulamak istiyorum:

SELECT * FROM `calendar` WHERE startTime = '2010-04-29'"

... ve "2010-04-29 10:00" DATETIME değerine sahip satırı almak istiyorum.

Herhangi bir öneri? Teşekkürler.

Yanıtlar:


164

Aşağıdakileri kullanın:

SELECT * FROM `calendar` WHERE DATE(startTime) = '2010-04-29'

Referans olması için 2 milyon kayıt tablom var, benzer bir sorgu çalıştırdım. Salils cevabı 4.48 saniye sürdü, yukarıdaki 2.25 saniye sürdü.

Yani tablo BÜYÜKse bunu daha çok öneririm.


8
İlk cevap çok yavaştır, çünkü karşılaştırmadan önce her bir tarih-saati bir dizeye biçimlendirmek zorundadır. Sizin
durumunuz

1
Performans bir sorunsa, tarih kısmına bir INDEX yerleştirilebilmesi için tarih ve saat bölümünü ayrı ayrı kaydetmeyi düşünmek faydalı olabilir.
Thijs Riezebeek

1
Bu sorgu startTime, indekslenmişse indeksi kullanamaz .
Zamrony P. Juhara

44

DATETIME sütununun DATE kısmının belirli bir değişmez değerle eşleştiği tüm satırları seçmek istiyorsanız, bunu şu şekilde yapamazsınız:

WHERE startTime = '2010-04-29'

çünkü MySQL bir DATE ve bir DATETIME doğrudan karşılaştıramaz. MySQL'in yaptığı şey, verilen DATE değişmez değerini '00: 00: 00 'zamanı ile uzatır. Böylece durumunuz

WHERE startTime = '2010-04-29 00:00:00'

Kesinlikle istediğin şey değil!

Koşul bir aralıktır ve dolayısıyla aralık olarak verilmelidir. Birkaç olasılık var:

WHERE startTime BETWEEN '2010-04-29 00:00:00' AND '2010-04-29 23:59:59'
WHERE startTime >= '2010-04-29' AND startTime < ('2010-04-29' + INTERVAL 1 DAY)

İlkinin yanlış olma olasılığı çok düşük - DATETIME sütununuz ikinci çözünürlük kullandığında ve 23:59:59 + epsilon'da bir randevu olduğunda. Genel olarak ikinci değişkeni kullanmanızı öneririm.

Her iki değişken de startTime'da tablo büyüdüğünde önemli hale gelecek bir dizin kullanabilir.


9
David'in versiyonu iyi değil, indeks kullanamıyor. Bir dizin kullanmak için, bir fonksiyonun (sonucu üzerinde doğrudan sütun üzerinde filtreye sahip date(), year(), datediff()veya herhangi bir benzeri)
Marki555

Mysql'nin tarihi tarih saatine nasıl dönüştürdüğünü arıyordum, eklediği için teşekkürler 00:00:00. şimdi benim sonuçlar mantıklı
Muhasebeci م

1
Bu varsa endeksi kullanamayan diğer cevaplar karşılaştırıldığında doğru hızlı bir çözümdür
Zamrony P. Juhara

23
SELECT * FROM `calendar` WHERE DATE_FORMAT(startTime, "%Y-%m-%d") = '2010-04-29'"

VEYA

SELECT * FROM `calendar` WHERE DATE(startTime) = '2010-04-29'

25
Bu korkunç bir sorgu. Bundan her ne pahasına olursa olsun kaçının. StartTime'da bir dizin varsa, doğrudan kullanmak yerine sütuna bir işlev uyguladığı için bu sorgu tarafından kullanılamaz. Bu, bunun gibi herhangi bir sorgunun tam bir tablo taraması gerektireceği anlamına gelir. Büyük bir tabloda bu, son derece yavaş bir sorgu anlamına gelir.
steveayre

Kabul ediyorum, cevabı yanlış - doğru cevap aşağıda David tarafından yayınlandı.
mindplay.dk

1
Lütfen David'in cevabını kullanın, çünkü çok daha hızlı. Bu geçerli, ancak hız için iyi değil ...
xarlymg89

1
@ CarlosAlbertoMartínezGadea Bu sürüm yavaştır çünkü karşılaştırmadan önce her bir değeri dizgeye göre biçimlendirmek zorundadır ... David'in sürümü buna ihtiyaç duymaz, ancak yine de dizinleri kullanamaz, bu nedenle optimal değildir. İndeksi kullanabilen bir versiyon için XL_'deki cevaba bakınız. Ne yazık ki bunu
mysql'de

1
Bu yanıta olumsuz oy verdim çünkü sorgu bir indeks kullanamaz, oysa @ XL_'nin cevabı.
pedromanoel

2
SELECT * FROM sample_table WHERE last_visit = DATE_FORMAT('2014-11-24 10:48:09','%Y-%m-%d %H:%i:%s')

mysql kullanarak datetime biçimi için bu DATE_FORMAT(date,format).


1
SELECT * FROM `calendar` WHERE DATE(startTime) = '2010-04-29';

yardımcı olur, DATEkarşılaştırmadan önceki gibi değerleri dönüştürebilirsiniz .


0

DATETIME alanını DATE tarihine şu şekilde çevirebilirsiniz:

SELECT * FROM `calendar` WHERE CAST(startTime AS DATE) = '2010-04-29'

Bu çok verimli.


1
Hayır, verimli de değil. bu startTime, indekslenmişse indeksi kullanamayacak
Zamrony P. Juhara

-6
SELECT * FROM `calendar` WHERE startTime like '2010-04-29%'

Daha sonra veya öncesinde bir şey bulmak istiyorsanız, MySQL tarihlerinde karşılaştırma işleçlerini de kullanabilirsiniz. Bunun nedeni, basit bir dizge sıralaması onları doğru şekilde sıralayacak şekilde (en büyük değerden en küçüğüne, başında sıfırlar) yazılmalarıdır.

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.