Tarih Saat Aralığı

MS SQL Server veritabanı ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Kullanıcı avatarı
pro_imaj
Kıdemli Üye
Mesajlar: 1364
Kayıt: 18 Oca 2005 05:45
Konum: Dünyadan

Mesaj gönderen pro_imaj »

Merhaba;

Hiç bu kadar mahçup olmamıştım.
Allah (cc) sizlerden razı olsun.

işimi fazlasıyla gördü sorun hem naile hanımın belirtiği son şekliyle hemde @OpenX belirttiği şeklide oldu.

@OpenX belirtiği şekilde yapınca serverdaki tarih tipi değiştirilmiş oluyor.

Saygılarımla
Teşekkür ederim. :P
Gün gelecek, dilleri, elleri ve ayakları yapmış oldukları bütün kötülükleri tek tek bildirerek aleyhlerinde şahitlik edecektir. [Nur Suresi 24]
_________________
Kullanıcı avatarı
ofenX
Üye
Mesajlar: 397
Kayıt: 09 Nis 2005 10:24
Konum: Diyarbakır
İletişim:

Mesaj gönderen ofenX »

Merhaba Naile Hanım,
Convertte benim anlayamadığım, Converti sizin bahsettiğiniz gibi kafamda canlandırıyordum. Ama oradaki teori ile pratiğim birbirine uymuyordu.
Ben style kısmına ne yazarsam yazayım. 'aa.gg.yyyy' şeklinde girmeye zorluyordu. Ta ki yukarıdaki set dateformatı kullanana kadar. Belki siz de dateformat 'gg.aa.yyyy' şeklinde olduğu için sizde sorun çıkarmamış.

Yoksa benim helpinden anladığım şuydu.

Kod: Tümünü seç

select convert(datetime,'2006.12.31 08:00:00',102)
select convert(datetime,'31.12.2006 08:00:00',104)
select convert(datetime,'31-12-2006 08:00:00',105)
yukarıdaki şekillerde bir problem olmaması lazımdı. Ama ben de hata veriyordu.

Kolay gelsin.
http://www.aysbergbilgisayar.com
Logo Go özel eğitim, web tasarım, teknik servis
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

ofenX yazdı: Ben style kısmına ne yazarsam yazayım. 'aa.gg.yyyy' şeklinde girmeye zorluyordu. Ta ki yukarıdaki set dateformatı kullanana kadar. Belki siz de dateformat 'gg.aa.yyyy' şeklinde olduğu için sizde sorun çıkarmamış.
Anladığın şey doğru ama neden o şekilde davrandığını anlaymadım.
Ben 102 (yy.mm.dd) de kullanıyorum 103(dd.mm.yy) de kullanıyorum. Herhangi bir sorunla karşılaşmadım ama.. Acaba serverın herhangi ayarlarından mı kaynaklanıyor ki?

pro_imaj halletmene sevindim.
Kullanıcı avatarı
pro_imaj
Kıdemli Üye
Mesajlar: 1364
Kayıt: 18 Oca 2005 05:45
Konum: Dünyadan

Mesaj gönderen pro_imaj »

Naile hanım bu konuda @openX ekatılıyorum. başka bir makinada sizin işleminizi yaptığımda hata ile karşılaştım taki.

Kod: Tümünü seç

set dateformat dmy 
Yani convert olsa bile bunu yapmayınca hata veriyor zaten bu kodu bir kere kullanmak yeterli oluyor.

Saygılarımla
Kolay gelsin.
Gün gelecek, dilleri, elleri ve ayakları yapmış oldukları bütün kötülükleri tek tek bildirerek aleyhlerinde şahitlik edecektir. [Nur Suresi 24]
_________________
Kullanıcı avatarı
pro_imaj
Kıdemli Üye
Mesajlar: 1364
Kayıt: 18 Oca 2005 05:45
Konum: Dünyadan

Mesaj gönderen pro_imaj »

Merhaba
Ya inanmıyacaksınız ama
set dateformat dmy Bu kodu çalıştırdıktan sonra regeditten lisas bilgisi olarak tarih tutturuyordum şimdi ilgili tarihi yanlış okuyor ve lisans düşüyor yani bir yeri yaparken başka bir yer bozuldu bence bu kod başka sorunlarada yol açabilir.


Saygılarımla
Kolay gelsin.
Gün gelecek, dilleri, elleri ve ayakları yapmış oldukları bütün kötülükleri tek tek bildirerek aleyhlerinde şahitlik edecektir. [Nur Suresi 24]
_________________
Kullanıcı avatarı
ofenX
Üye
Mesajlar: 397
Kayıt: 09 Nis 2005 10:24
Konum: Diyarbakır
İletişim:

Mesaj gönderen ofenX »

O zaman siz de işinizi bitirdikten sonra eski haline getirseniz olmaz mı?

Kolay gelsin.
http://www.aysbergbilgisayar.com
Logo Go özel eğitim, web tasarım, teknik servis
Kullanıcı avatarı
pro_imaj
Kıdemli Üye
Mesajlar: 1364
Kayıt: 18 Oca 2005 05:45
Konum: Dünyadan

Mesaj gönderen pro_imaj »

Merhaba openX

Hocam söylediğiniz şekilde olmuyor yani şöyleki.
Regeditte date olan bir alana lisas tarihi olarak 15.03.2006 yazırıyorum.
Ama bu işlemi yaptığımda yani tekrar eski hali getirdiğimde 15.03.06 şeklinde geliyor bende eşleştirme yaptığımda yanlış sonuç veriyor.

isterseniz bir deneyin.

Delphi ile

Kod: Tümünü seç

caption:=datetostr (date);
yapıp bakabilrsiniz hiçbirşekilde artık düzelmiyor. eskiden 15.03.2006 gösterdiği tarihi artık 15.03.06 gösteriyor.

Saygılarımla
Teşekkürler.
Gün gelecek, dilleri, elleri ve ayakları yapmış oldukları bütün kötülükleri tek tek bildirerek aleyhlerinde şahitlik edecektir. [Nur Suresi 24]
_________________
Kullanıcı avatarı
ofenX
Üye
Mesajlar: 397
Kayıt: 09 Nis 2005 10:24
Konum: Diyarbakır
İletişim:

Mesaj gönderen ofenX »

Merhaba,
öncelikle şunu söyleyeyim. Acaba benim ne demek istediğimi anlamış mısınız?
Eski haline getirin derken.
set dateformat dmy
select convert(datetime,'31.12.2006')
set dateformat mdy
şeklinde kullandınız mı?
verdiğiniz örnek bende 15.03.2006 şeklinde çalıştı.

Ayrıca tam olarak emin değilim (ingilizcem yeterli olmadığı için)
set dateformat stringden tarihe çevrim yaparken gün,ay,yıl ı farklı konumlardan uygun şekilde almak için kullanılıyor.
tarih bilgisinin görüntüsünü değiştirmiyor gibi bir şeyler yazıyor.
Remarks

This setting is used only in the interpretation of character strings as they are converted to date values. It has no effect on the display of date values.

The setting of SET DATEFORMAT is set at execute or run time and not at parse time.
Kolay gelsin.
http://www.aysbergbilgisayar.com
Logo Go özel eğitim, web tasarım, teknik servis
Kullanıcı avatarı
pro_imaj
Kıdemli Üye
Mesajlar: 1364
Kayıt: 18 Oca 2005 05:45
Konum: Dünyadan

Mesaj gönderen pro_imaj »

ofenX yazdı:öncelikle şunu söyleyeyim. Acaba benim ne demek istediğimi anlamış mısınız?
Eski haline getirin derken.
set dateformat dmy
select convert(datetime,'31.12.2006')
set dateformat mdy
hocam evet bende bunu anlmıştım zaten. Bölgesel ayarlara baktığımda buradaki ayar nasıl olduysa değişmiş onu tekrar düzeltince kod bloku sorunsuz çalışıyor başka bir bilg. bunu denem şansım olduğunda sonucu yazarım yani. bölgesel ayarlardan tekrar manuel bir düzeltme gerekli olup olmadığını.

Değerli Yardımlarınız için çok teşekkür ederim.

Çalışmalarınızda başarılar.
Gün gelecek, dilleri, elleri ve ayakları yapmış oldukları bütün kötülükleri tek tek bildirerek aleyhlerinde şahitlik edecektir. [Nur Suresi 24]
_________________
Kullanıcı avatarı
ofenX
Üye
Mesajlar: 397
Kayıt: 09 Nis 2005 10:24
Konum: Diyarbakır
İletişim:

Mesaj gönderen ofenX »

Evet convert ten bir şeyler anlayarak bu mesaja başlayayım.
Sanırım ben örneklerde converti

Kod: Tümünü seç

CONVERT (DOUBLE PRECISION, TARIH)
ş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. :oops: 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

Kod: Tümünü seç

select @@language 
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.
En son ofenX tarafından 18 Mar 2006 11:26 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
http://www.aysbergbilgisayar.com
Logo Go özel eğitim, web tasarım, teknik servis
Kullanıcı avatarı
pro_imaj
Kıdemli Üye
Mesajlar: 1364
Kayıt: 18 Oca 2005 05:45
Konum: Dünyadan

Mesaj gönderen pro_imaj »

ofenX yazdı: 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)

Hocam bir parantez eksiğiniz kalmış. :)

Kod: Tümünü seç

SELECT     *
FROM        Barkod
WHERE     CONVERT(DATETIME,BTarih+' '+ BSaat,104[b])[/b]  BETWEEN
CONVERT (DATETIME, '01.01.2006 08:00',104)    AND
CONVERT (DATETIME, '01.02.2006 08:00',104) 

Saygılarımla
Değerli yardımlarınız ve açıklayıcı bilgileriniz için teşekkür ederim.
:oops:
Gün gelecek, dilleri, elleri ve ayakları yapmış oldukları bütün kötülükleri tek tek bildirerek aleyhlerinde şahitlik edecektir. [Nur Suresi 24]
_________________
Cevapla