Tarih Saat Aralığı
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:ş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.
dbExpress'te:
Kod: Tümünü seç
DataSet.ParamByName('parStartDateTime').DataType := ftTimeStamp;
DataSet.ParamByName('parStartDateTime').AsSQLTimeStamp := DateTimeToSQLTimeStamp(StartDateTime);
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.
Merhaba;
Naile hanım verdiğiniz kodda şu hatayı alıyorum.
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.
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')
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.
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]
_________________
_________________
Merhaba,
sql de time yoktur. time yerine datetime kullanacaksınız.
Kolay gelsin.
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
Logo Go özel eğitim, web tasarım, teknik servis
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')
Tamam şimdi anladım, ben daha önceleri bde şimdi ise ado kullanıyorum, dbexpress hiç kullanmadım.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.
En son naile tarafından 15 Mar 2006 10:38 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
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.
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]
_________________
_________________
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.
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]
_________________
_________________
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.
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
Logo Go özel eğitim, web tasarım, teknik servis
Ç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?
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..
Kod: Tümünü seç
CONVERT(DATETIME, CONVERT(datetime,Tarih,101) + CONVERT(DATETIME,Saat,108), 109)
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..
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
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]
_________________
_________________
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:
İyi çalışmalar.
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:
Eğer ikinci yolu tercih edeceksen SUBSTRING fonksiyonunu kullanabilirsin.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.
İyi çalışmalar.
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
Teşekkürler
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

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]
_________________
_________________
Merhaba,
Ama verilen örnekler işinizi görecek gibi.
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.
Lks nin vtyoneti de bana farkı vermiyor olabilir.
Kolay gelsin.
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.pro_imaj yazdı:Merhaba;
Set date diye bir funtiona rastlamadım![]()
Ama verilen örnekler işinizi görecek gibi.
Daha ayrıntılı bilgi için aşağıdaki linki kullanın.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
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.

Lks nin vtyoneti de bana farkı vermiyor olabilir.
Kolay gelsin.
http://www.aysbergbilgisayar.com
Logo Go özel eğitim, web tasarım, teknik servis
Logo Go özel eğitim, web tasarım, teknik servis
Merhaba,
Çünkü tarihi '12.31.2006 8:00:00' şeklinde girmem gerekiyordu.
Şimdi aşağıdaki şekilde kullanınca bir problem çıkarmıyor.
veya
Kolay gelsin.
ben converti aşağıdaki şekilde aldığımda bana hata veriyordu.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.![]()
Lks nin vtyoneti de bana farkı vermiyor olabilir.
Kod: Tümünü seç
select convert (datetime ,'31.12.2006 8:00:00',104)
Ş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')
Kod: Tümünü seç
set dateformat dmy
select convert (datetime ,'31.12.2006 8:00:00',104)
http://www.aysbergbilgisayar.com
Logo Go özel eğitim, web tasarım, teknik servis
Logo Go özel eğitim, web tasarım, teknik servis
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.
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.