Evet convert ten bir şeyler anlayarak bu mesaja başlayayım.
Sanırım ben örneklerde converti
şeklinde style özelliği olmadan kullanıyordum. Style özelliği olmadan kullanınca default değer olan 'aa.gg.yyyy' şeklinde alıyordu. Bu da
'31.12.2006' şeklinde olan bir tarihi yanlış olarak çevirmesine neden oluyordu.
Bu gün sakin kafayla uğraşayım dedim. Bu gün de convert bende olması gerektiği gibi çalışıyor.

Yani,
Kod: Tümünü seç
select convert (datetime ,'31.12.2006 8:00:00',104)
şeklindeki bir komut düzgün olarak çalışıyor.
Şimdi ortalığı biraz derleyip toplayalım. pro_imaj arkadaşımızın anlattıklarına göre :
tarih bilgisi string olarak '31.12.2006' ,
saat bilgisi string olarak '08:00:00' olarak vt de tutuluyor.
Benim örneklerimde de aşağıdaki gibi değerler var.
Kod: Tümünü seç
KNO TARIHSTR BSAAT
-------- -------------- -----------
35 10.10.2005 08:00:00
75 11.10.2005 09:00:00
90 11.10.2005 07:00:00
Şimdi Naile Hanım'ın verdiği örnek üzerinde yoğunlaşalım.
pro_imaj yazdı:
Merhaba;
Kod: Tümünü seç
SELECT *
FROM Barkod
WHERE (CONVERT(DATETIME, cast(BTarih as datetime) + cast(BSaat as time) , 120) BETWEEN '01.01.2006 08:00' AND '01.02.2006 08:00')
Naile hanım verdiğiniz kodda şu hatayı alıyorum.
daha önce verdiğim set dateformat ı kullanmadan bu işimizi göreceğiz ama bazı değişiklik ve hatalarımızı telafi ederek.
Hata ve Eksiklerimiz
1) Pro_imaj arkadaşımız birinci hatasını style i 120 bırakarak yapmış.
Halbuki girdiğimiz veri '31.12.2006' şeklinde olduğundan style i 104 olmalıydı.
2) cast default style e göre çevrim yapıyor. o yüzden oradaki
Kod: Tümünü seç
WHERE (CONVERT(DATETIME, cast(BTarih as datetime) + cast(BSaat as time) , 120)
kısmını
Kod: Tümünü seç
WHERE CONVERT(DATETIME, BTarih+' '+BSaat , 104)
şekline getirmemiz lazım. Ayrıca oradaki +' '+ kısmına dikkat edin. Bir boşluk eklemezsek bilgimiz '31.12.200608:00:00' şekline gelir ki bu da tarihe çevrilemez. Bir boşluk ekleyerek '31.12.2006 08:00:00' şekline getiriyoruz.
3) Between in tarih aralığını da '31.12.2006' şekline getirmemiz lazım.
Onun için de
Kod: Tümünü seç
CONVERT (DATETIME, '01.01.2006 08:00:00',104)
şekline getirmemiz lazım.
Bu son yaptıklarımıza göre benim verdiğim örnek
Kod: Tümünü seç
SELECT *
FROM SAYILAR
WHERE CONVERT(DATETIME, TARIHSTR +' '+BSaat , 104) BETWEEN
CONVERT (DATETIME, '10.10.2005 08:00:00',104) AND
CONVERT (DATETIME, '11.10.2005 08:00:00',104)
sadece 35,ve 90 nolu kayıtları getirecektir.
Bu durumda sizin kod aşağıdaki şekle gelecektir.
Kod: Tümünü seç
SELECT *
FROM Barkod
WHERE CONVERT(DATETIME,BTarih+' '+ BSaat,104) BETWEEN
CONVERT (DATETIME, '01.01.2006 08:00',104) AND
CONVERT (DATETIME, '01.02.2006 08:00',104)
Bu durumda set dateformat ı kullanmadık. dil ingilizce olsa bile işimizi görüyor. Kullandığınız dili
ile öğrenebilirsiniz. Default olarak us_english tir.
Kolay gelsin.
@pro_imaj ın uyarısı üzerine
WHERE CONVERT(DATETIME,BTarih+' '+ BSaat,104 BETWEEN
satırını
WHERE CONVERT(DATETIME,BTarih+' '+ BSaat,104) BETWEEN
şeklinde değiştirdim.