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.
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

@pro_imaj, kafanı fazla karıştırma. Merak da etme. Sağlıklı çalışır. Test edildi.

Bir de mümkünse gönderilen mesajları baştan sona bir kere daha dikkatlice okur musun? Zira verilen bazı cevapları kaçırmışsın gibi geliyor.

İyi çalışmalar.
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

Naile hanım, malesef yine de sorunla karşılaşabiliyorsunuz. Kullandığınız componentlere göre parametre tiplerini değiştirmeniz gerekiyor. BDE ve dbExpress componentlerinde TIMESTAMP farklı değerlendiriliyor.
dbExpress'te:

Kod: Tümünü seç

DataSet.ParamByName('parStartDateTime').DataType := ftTimeStamp;
DataSet.ParamByName('parStartDateTime').AsSQLTimeStamp := DateTimeToSQLTimeStamp(StartDateTime);
şeklinde kullanmanız gerekiyor.
Sonuçta ben bu problemle karşılaştım ve çözüm olarak belirttiğim çözümü uygulamaya karar verdim. (BDE'den dbExpress'e geçmek zorunda kaldım.)
Zira DATETIME-TIMESTAMP şu ana kadar epey sorun çıkarttı, canımı sıktı. Ben de onu bu çözümle en azından Delphi içinde kendi adıma sorun olmaktan çıkarttım.

İyi çalışmalar.
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;

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.

Kod: Tümünü seç

Server: Msg 243, Level 16, State 1, Line 1
Type time is not a defined system type.
Server: Msg 243, Level 16, State 1, Line 1
Type time is not a defined system type.
BTarih ve BSaat alanları string tipinde cast ile tarihi datetime Bsaat Time çeviriyorum. Galiba saati çevirmede hata oluyor.

Saygılarımla
Teşekkür ederim.
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,
sql de time yoktur. time yerine datetime kullanacaksınız.

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 »

Time diye bir tip olmadığından hata veriyor. Saati ayrıyeten birşeye çevirmene gerek yok, tarihle + yaparak topladığında sorun çıkarmıyor. Ben denedim çalışıyor.

Kod: Tümünü seç

WHERE     (CONVERT(DATETIME, CAST(BTarih AS datetime) + BSaat, 120) BETWEEN '01.01.2006 08:00' AND '02.01.2006 08:00')
Hakan Can yazdı:Sonuçta ben bu problemle karşılaştım ve çözüm olarak belirttiğim çözümü uygulamaya karar verdim. (BDE'den dbExpress'e geçmek zorunda kaldım.)
Zira DATETIME-TIMESTAMP şu ana kadar epey sorun çıkarttı, canımı sıktı. Ben de onu bu çözümle en azından Delphi içinde kendi adıma sorun olmaktan çıkarttım.
Tamam şimdi anladım, ben daha önceleri bde şimdi ise ado kullanıyorum, dbexpress hiç kullanmadım.
En son naile tarafından 15 Mar 2006 10:38 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
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 Naile hanım;

Sizin son yazdığınız şart ile yaptım ama yine hata msj alıyorum verileri listeliyor ama hata msj da veriyo.

Kod: Tümünü seç

(927 row(s) affected)

Server: Msg 8115, Level 16, State 2, Line 1
Arithmetic overflow error converting expression to data type datetime.
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 »

BSaat Alanı da string tipinde naile hanım

Convert tip olarak 120 yerine 109 kullanıyorum.(mon dd yyyy hh:mi:ss:mmmAM (or PM) aynı hata msj alıyorum.

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 ,
sql serverde bilmiyorum. Ama Lks nin vtyonet aracı ile stringi convert ile tarihe çevirdiğimde daha önceki mesajlarımda belirttiğim gibi tarihi
'aa.gg.yy' olarak convert ediyordu. Yani sizin verinizin yeri farklı olabilir.
sizde 'gg.aa.yy' şeklinde kayıtlı ise sorun verebilir.

Bunun için set date formatı kullanabilirsiniz. Benim vtyonette hiç bir işe yaramamıştı. gerçi.

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 »

Çok ilginç, ben de tablo oluşturdum ve tarih, saat alanlarını varchar yaparak denemeler yapıyorum iki türlü de hata vermeden çalışıyor. Bir de şu şekilde dener misin?

Kod: Tümünü seç

CONVERT(DATETIME, CONVERT(datetime,Tarih,101) + CONVERT(DATETIME,Saat,108), 109)


101: mm/dd/yy
108: hh:mm:ss

Diğer türlü eğer olmuyorsa ve eğer tablo yapısını sen belirleyebiliyorsan tablondaki tarih ve saat alanlarını tek bir alan olarak kullanıp datetime ile birleştirerek saklamayı deneyebilirsin ya da Hakan Can'ın kullandığı gibi integer'a çevirerek..
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 Naile hanım;

Tarih yazdırdığım alanalar nvarchar alanlar veri tabanında ise
BTarih=01.01.2006
BSaat:08:00:00 şeklinde tutluyor.

Hakan can dediği şekilde veritabanına tarihin ve saatin sayısal şeklinide yazdırabilrim. ama değişen ne olacakki.
Hakan ca hocam Veri tabanında
Btarih=21.01.2006 yerine ona denk olan 38738 rakamını
BSaat=13:59:51 yerine ona denk olan 53969 rakamını yazdırabilrim. ama sorun bence buradan değil. yani yanlış sonuç veriyor olmasından ziyade datetime alan kullanmadan bence çözülmeyecek gibi.

Naile hanımda çalışan kodlar benim vtde neden çalışmadı onada bir anlma veremiyorum tabi.


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]
_________________
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

Keşke başta her iki alan için VARCHAR kullandığını belirtseydin (Belki de belirttin ben farkedemedim). Ben şahsen her iki değişkenin de DATETIME olduğunu düşünüp de ona göre çözümler önermeye çalışmıştım.

Bu durumda iki seçeneğin var:
1. Ya her iki alanı tek bir DATETIME alanında birleştireceksin.
2. Ya da değiştirmeden CAST mantığıyla çözüm üreceteceksin.

Bu arada benim SAYISAL'a çevirme tavsiyem galiba yanlış anlaşıldı. Ben tarih-saatin veritabanında SAYISAL olarak tutulmasını kastetmedim. Yine veritabanında DATETIME şeklinde tutulup Query'lerde CAST ile SAYISAL'a çevrilerek işlem yapılmasını kastetmiştim. Zaten ilk önerdiğim çözüm şekli de buydu:
YIL * 100000.0 + AY * 1000.0 + GUN formülü daha kesin bir çözüm olur.
Günü sona yazdın, yok ay baştaydı, yıl sondaydı derdiniz olmaz.

Kod:
WHERE YEAR(TARIH) * 100000.0 + MONTH(TARIH) * 1000.0 + DAY(TARIH) BETWEEN
YEAR(:parBASLANGICTARIHI) * 100000.0 + MONTH(:parBASLANGICTARIHI) * 1000.0 + DAY(:parBASLANGICTARIHI) AND
YEAR(:parBITISTARIHI) * 100000.0 + MONTH(:parBITISTARIHI) * 1000.0 + DAY(:parBITISTARIHI)


Artık saat işini de siz halledersiniz.

Tabi tercih sizin.
Eğer ikinci yolu tercih edeceksen SUBSTRING fonksiyonunu kullanabilirsin.

İyi çalışmalar.
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;
evet sorunu buldum sanırım. @ofenX de belittiği gibi ay ile gün alanları yüzüne oluyor.

13.01.2006 =13 ayın 1 günü 2006 şeklinde yaptığından hata veriyor. Çevrim tiplerinde böyle bişeyi nasıl yapabilirim acaba yani bu sorun bilg. bölgesel ayarlarındanmıdır birde aklım bu geldi. 13.01.2006 =1 ayın 13ü 2006 şeklinde nasıl algılatabilrim.

Set date diye bir funtiona rastlamadım :oops:
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,
pro_imaj yazdı:Merhaba;
Set date diye bir funtiona rastlamadım :oops:
Kasdettiğim set dateformat tı. Ben şu an lks demosunu kullandığım için msde 2000 desktop engine kullanıyorum. Orda tam olarak sonuç alamadım.
Ama verilen örnekler işinizi görecek gibi.
SET DATEFORMAT mdy
GO
DECLARE @datevar datetime
SET @datevar = '12/31/98'
SELECT @datevar
GO

SET DATEFORMAT ydm
GO
DECLARE @datevar datetime
SET @datevar = '98/31/12'
SELECT @datevar
GO

SET DATEFORMAT ymd
GO
DECLARE @datevar datetime
SET @datevar = '98/12/31'
SELECT @datevar
GO
Daha ayrıntılı bilgi için aşağıdaki linki kullanın.
http://msdn.microsoft.com/library/defau ... t_052s.asp

Ayrıca ben hala convertin mantığını kapamadım ki size yardımcı olabileyim. ya ben onun mantığını yanlış anlamışım ya da desktop engine de bana onu vermiyor. :oops:
Lks nin vtyoneti de bana farkı vermiyor olabilir.

Kolay gelsin.
http://www.aysbergbilgisayar.com
Logo Go özel eğitim, web tasarım, teknik servis
Kullanıcı avatarı
ofenX
Üye
Mesajlar: 397
Kayıt: 09 Nis 2005 10:24
Konum: Diyarbakır
İletişim:

Mesaj gönderen ofenX »

Merhaba,
ofenX yazdı:Merhaba,
Ayrıca ben hala convertin mantığını kapamadım ki size yardımcı olabileyim. ya ben onun mantığını yanlış anlamışım ya da desktop engine de bana onu vermiyor. :oops:
Lks nin vtyoneti de bana farkı vermiyor olabilir.
ben converti aşağıdaki şekilde aldığımda bana hata veriyordu.

Kod: Tümünü seç

select convert (datetime ,'31.12.2006 8:00:00',104)
Çünkü tarihi '12.31.2006 8:00:00' şeklinde girmem gerekiyordu.

Şimdi aşağıdaki şekilde kullanınca bir problem çıkarmıyor.

Kod: Tümünü seç

set dateformat dmy
select convert (datetime ,'31.12.2006 8:00:00')
veya

Kod: Tümünü seç

set dateformat dmy
select convert (datetime ,'31.12.2006 8:00:00',104)
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 »

Ms sql serverın helpinde CONVERT e baktığında kullanabileceğin tarih formatlarının listesini göreceksin. İstediğin formata göre kullanacağın numarayı seçebilirsin. MEsela ofenX in yazdığı 104 dd.mm.yy ye karşılık geliyor. Eğer sen ay önce olsun istiyorsan yani mm/dd/yy şeklinde istiyorsan 101 kullanmalısın. Şöyle açıklayayım:

12. ayın 31 i demek için:
CONVERT(DATETIME, '12/31/2006',101)
veya
CONVERT(DATETIME,'31.12.2006',104)

aynı şeyi verir. CONVERT'e gönderdiğin parametre, yazdığın tarihin nasıl bir formatta yazdığını gösterir. Yani önce ayı mı yazdın günü mü yazdın v.b.
Cevapla