2010-08-12 19 views
7

olarak depolanan tarihleri ​​ARASINDA arama i istiyoruz select * from table where dates between (some_date and another_date)MySQL: varchar

için sorun tarihleri ​​varchar olarak depolanır olmasıdır!

burada ben var tarihlerin örnekler:

7/29/2010 9:53 AM 
7/16/2010 7:57:39 AM 

bazı kayıtlar saniye olduğunu fark edin ve bazı yoktur

i zaman hakkında ilgilendirmiyor

hiç ben sadece tarihine gerek

reporttime çalışmıyor date alan

şudur:

SELECT * FROM batchinfo 
where cast(reporttime as date) between ('7/28/10' and '7/29/10') 

bu:

SELECT * from batchinfo WHERE reporttime BETWEEN STR_TO_DATE(7/28/2010, '%m/%/d/%Y %h:%i:%s %p') 
       AND STR_TO_DATE(7/29/2010, '%m/%/d/%Y %h:%i:%s %p') 

dönüyor:

Truncated incorrect datetime value: '7/8/2010 11:47 AM' 
Incorrect datetime value: '0.00012009' for function str_to_date 

bu:

SELECT * from batchinfo WHERE STR_TO_DATE(reporttime, '%m/%/d/%Y %h:%i:%s %p') BETWEEN STR_TO_DATE(7/28/2010, '%m/%/d/%Y') 
                  AND STR_TO_DATE(7/29/2010, '%m/%/d/%Y') 

dönüyor:

Incorrect datetime value: '7/8/2010 11:47 AM' for function str_to_date 

OMG midillileri:

SELECT * from batchinfo WHERE STR_TO_DATE(LEFT(reporttime,LOCATE(' ',reporttime)), '%m/%/d/%Y') BETWEEN STR_TO_DATE(7/28/2010, '%m/%/d/%Y') 
                  AND STR_TO_DATE(7/29/2010, '%m/%/d/%Y') 

ve şimdi bu geri almak:

i ilk boş önce her şeyi alıyorum

Incorrect datetime value: '7/8/2010' for function str_to_date 
+1

benim güncelleştirme Bkz ise - gelecekte ne hakkında daha net olsaydı, bu yardımcı olur Sorun başlangıçta oldu. Örnek veri, tablo yapısı ve beklenen çıktı sağlayın. –

+1

Güncelleştirilen yanıtıma bakın – Mchl

+1

Sağladığım tarih biçimi yanlış. '% M /% d /% Y' olmalıdır. Ayrıca sorgunuza tarihler koyduğunuzda, onları '' (çünkü aslında dizeleri) – Mchl

cevap

7

Tarihleri ​​arasında aramak için, tarihleri ​​tarihleri ​​arasında depola. Onları dizge olarak saklayarak, kendini ayağa fırlatıyorsun. Temel olarak, dize (SUBSTR() veya LEFT() kullanarak) tarih bölümünü ayıklamanız ve tarih biçimine (STR_TO_DATE() kullanarak) ayrıştırmanız gerekir.

Böyle bir çözümün performansı değerlendirilecek.

STR_TO_DATE(LEFT(reporttime,LOCATE(' ',reporttime)),'%m/%d/%Y') BETWEEN '2010-07-28' AND '2010-07-29'

+0

Seçtiğiniz ifadenin –

+1

gibi görüneceğini bana gösterir misiniz updated answer – Mchl

+0

Yanlış tarih değeri: '7/8/2010' işlev str_to_date –

0

Sen TARİH veya tarih türü için varchar değerlerini CAST edebilirsiniz .

WHERE CAST(dates AS DATE) BETWEEN (7/28/10 and 7/29/10) 

Bu, optimal bir çözüm olmayabilir, çünkü dizinlerin sağladığı yararı kaybedebilirsiniz.

+0

SELECT * batchinfo (döküm zamanı) (7/29/10 ve 7/28/10) arasında - bu çalışmaz –

+1

Sorgu: SELECT CAST ('7/29/2010 9:53 AM' DATE AS); Sonuç: Boş – Mchl

+0

Emin değil, 7/29/10 ve 7/28/10 değil mi tersine çevrilmeli? – bobs

5

STR_TO_DATE to convert the strings to the DateTime data type'u kullanın. biçim stenografi DATE_FORMAT altında bulunur:

STR_TO_DATE(column, '%m/%/d/%Y %h:%i:%s %p') 

sorundur, Eğer VARCHAR sen kullanmadan önce, aynı formatınıilk herkese büyük güncellemek gerekecek:

WHERE STR_TO_DATE(reporttime, '%m/%/d/%Y %h:%i:%s %p') BETWEEN STR_TO_DATE(some_date, '%m/%/d/%Y') 
                  AND STR_TO_DATE(another_date, '%m/%/d/%Y') 

Tarih biçimleri tutarlı değil (bazıları tire, diğerleri eğik çizgi kullanır ve Yıl/Ay/gün sırası tamamen farklı olabilir ...), bu nedenle en uygun olanı, & tutarlı yöntemdir. bir string'i DateTime'a dönüştürmek. Sadece DateTime değeri geldikten sonra, Tarih/Saat işlevi DATE() gibi kullanılabilir hale gelir ve sadece tarih bölümünü alır.

Veri türü değişikliğinden dolayı, bazı_date & another_date sütunlarındaki bir dizin kullanılamaz.

+0

report zaman varchar, date değil –

+0

@OMG Ponies: lütfen güncellenmiş soruya bakın yardımınız için çok teşekkürler –

+0

@ | __: WHERE maddesini benim yanıtımda güncelledim - dönüştürdüğünüz şey açık değildi . Ancak, listelediğiniz verilerin sürekli olarak biçimlendirilmediğini unutmayın. –

1

kullandığınız SQL bu sorgu kullanmak

Veri

DECLARE @Dates TABLE (StartDate varchar(100)); 

INSERT INTO @Dates VALUES ('7/1/2010 9:10 AM'); 
INSERT INTO @Dates VALUES ('7/5/2010 10:33 AM'); 
INSERT INTO @Dates VALUES ('7/13/2010 04:53 AM'); 
INSERT INTO @Dates VALUES ('7/22/2010 8:45 AM'); 
INSERT INTO @Dates VALUES ('7/10/2010 11:20 AM'); 
INSERT INTO @Dates VALUES ('7/11/2010 12:40 AM'); 

Sorgu: Bu tarihi sorgu acağından

SELECT * FROM @Dates 
WHERE (CONVERT(datetime,StartDate,101) >= CONVERT(datetime,'7/1/2010 9:10 AM',101)) 
             AND (CONVERT(datetime,StartDate,101) <= CONVERT(datetime,'7/15/2010 9:10 AM',101)) 
ORDER BY CONVERT(datetime,StartDate,101) 
0

...

Database 'Date' Will be like '01/01/2016' and datatype is 'varchar' 

SELECT * FROM `test` WHERE STR_TO_DATE(`test`.`date`, '%d/%m/%Y') BETWEEN '2016-01-01' AND '2016-01-31' ORDER BY `test`.`date` ASC 
0

tarih Varchar

yılında

Sorgu VE c.sentdate> '2016-Haziran-15'

İlgili konular