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

Tarih Saat Aralığı

Mesaj gönderen pro_imaj »

Merhaba;

Üretim raporu için yaptığım sorguda bir mantık hatası var ve ben işin içinden çıkamadım.

Kod: Tümünü seç

SELECT Barkod.MalKodu, Barkod.Kod13, Barkod.Kod14,
Barkod.Kod7, Sum(Barkod.Tutar3) AS Tutar3,  
Sum(Barkod.Kod11) AS Kod11, Sum(Barkod.Miktar2) AS Miktar2, Sum(Barkod.Miktar) AS Miktar,
Sum(Barkod.Iskonto) AS Iskonto, Sum(Barkod.Tutar2) AS Tutar2, 
Sum(Barkod.Miktar3) AS Miktar3,  
Sum(Barkod.BlkMiktar) AS BlkMiktar,  
Sum(Barkod.PromosyonMiktar) AS PromosyonMiktar,  
Sum(Barkod.Kod12) AS Kod12 
FROM Barkod 
Where (BTarih Between '01.03.2006' and  '02.03.2006') and (BSaat Between '00:00:00' and  '23:59:59')  and Kod1='True'  
GROUP BY Barkod.MalKodu, Barkod.Kod13,
Barkod.Kod14, Barkod.Kod7
Yukarıdaki sorguda sadece şart alanına bakmanız yetecek.
Ben yukarıda 3. ayın 1 ile 3 ayın 2 arasındaki ve saat 0 dan 24 kadarki üretimleri veriyorum.

Benden istenen mesela verilen tarih aralıklarındaki şu saatten şu saate kadarki üretim? Yani örn;

02.02.2006 -03.02.2006
08:00:00 -08:00:00

yani saat 8 den ertesi gün saat 8 e kadarki üretimleri istiyorlar.

Benim sorgumda ise böyle yapınca hiç kayıt getirmiyor çünkü saat aralığı nı baz alıyorum.

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]
_________________
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

MS-SQL'de TimeStamp Between yok mu?

Yani

cast(BTARIH || ' ' || BSAAT as timestamp) between '03.02.2006 08:00' and '04.02.2006 08:00'

gibi birşey olmuyor mu? (Oluyordur canım.) :)
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

Şu şekilde yapabilirsin

Kod: Tümünü seç

WHERE     (BTarih BETWEEN '01.01.2006' AND '02.01.2006') AND ((BTarih = '01.01.2006') AND (BSaat >= '08:00') OR
                      (Tarih = '01.02.2006') AND (BSaat <= '08:00'))
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

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: Tümünü seç

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.
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;
Teşekkürederim Naile hanım :alkis:
Ben mantık hatası yaptığımı biliyordum ama bulamamıştım.

Coderlord Timestamp alanlar ne işe yarıyor acaba. Sizin verdiğiniz kod çalışmadı.

Saygılarımla
Ç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]
_________________
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

pro_imaj yazdı: Coderlord Timestamp alanlar ne işe yarıyor acaba. Sizin verdiğiniz kod çalışmadı
Tahmin etmiştim çünkü Firebird syntax'ına göre verdim. :)

Tarih ve saatin birarada olduğu alan tipi Timestamp. Misal '03.04.2006 12:35'

gibi.
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 @coderlord;

Timestamp alanın sormamdaki amaç Güneş. veri tabanında böyle bir alan var ve değeri <Binary> olarak gözüküyordu. Belki farklı değerler alabiliyor diye düşünmüşütüm. Garip :oops:
Teşekkür ederim 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ı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

ms sql serverda tarih ve saat için datetime kullanılıyor. Maalesef timestamp ı ben kullanamamıştım çünkü nasıl değer vermek gerekiyor bilemedim, hata veriyor. Ama firebirdde coderlordun dediği gibi çalışıyor.
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

MS SQL'de timestamp farklı bir data tipi. MS SQL Server 2000'in helpine bakarsanız; bunun yerine rowversion kullanın, ilerde belki timestamp'i SQL-92' deki anlamında kullanılır hale getiririz demişler. Aynı şekilde MS SQL Server 2005'in helpine bakın; bu sefer SQL-2003 standartlarından bahsediyor. Ama ne değişmiş ne de değiştiririz diyorlar.
Sonuç olarak TIMESTAMP MS SQL'de maalesef ANSI-SQL'in dışında kaldı. Gerçi ben şahsen MS SQL 2005 ile MS SQL 2000 arasında yazılımcı açısından ne fark var anlayamadım. Hatta bunu foruma mı sorsak?

İ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;
Timestamp alanı güneş programında random değer veriyorlar işlemlerde bende anlayamadım ama böyle bir vtye kayıt eklerken bu alana bişey yazdırmıyorum sorun çıkmıyor ama veride yazımıyor.

Belki bu başlıkta yeri değil ama küçük bişey danışmak istiyorum.Veri tabaındaki alanlarda Null alanların sakıncası varmıdır acaba. (Güneş prog. bütün alanlara bişeyler yazıyor string alanlara boşluk sayısal alanlara ise 0 yazıtor o alan ile ilgili bir işlem yoksa.)

Teşekkür ederim.
İyi akşamlar.
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ı:Veri tabaındaki alanlarda Null alanların sakıncası varmıdır acaba. (Güneş prog. bütün alanlara bişeyler yazıyor string alanlara boşluk sayısal alanlara ise 0 yazıtor o alan ile ilgili bir işlem yoksa.)
O sanırım onların tekniği, ama o tekniği gerektirmeyecek şekilde program da yapılabilir.

sum veya avg kullanılırken hatalı sonuç vermesin diye böyle bir şey yapmışlardır.

Ama onun üstesinden gelmek için Coalesce kullanılıyor. Ama siz onlara uymak zorundasınız.

Kendiniz program yaparsanız Coalesce kullanarak null olsa bile 0 ver diyebilirsiniz. Bu da hatalı sonuç almaya engeller.

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;

@ofenX cevabın için tşk ederim zaten ben Coalesce kulllanıyorum.kendi veritabanımdada bazın Coalesce yerinde şundan büyük veya küçük değerlerini kullanıyorum. sorun kalmıyor.

Teşekkür ederim.
İyi çalışmalar.
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;
naile yazdı:Şu şekilde yapabilirsin

Kod: Tümünü seç

WHERE     (BTarih BETWEEN '01.01.2006' AND '02.01.2006') AND ((BTarih = '01.01.2006') AND (BSaat >= '08:00') OR
                      (Tarih = '01.02.2006') AND (BSaat <= '08:00'))
Naile Hanım yukarıda bahsettiğiniz şekilde günlük olduğunda doğru veriyor yani 01.01.2006 02.01.2006 üretim raporunda sorun yokta mesela 2 günlük bir rapor istendiğinde vermiyor.

Kod: Tümünü seç

((BTarih = '01.01.2006') AND (BSaat >= '08:00') OR
                      (Tarih = '01.02.2006') AND (BSaat <= '08:00'))

Yukarıda Tarih alkanları eşitse diyoruz. Ben bunları büyük eşit küçük eşit şeklinde kullanmaya çalıştım böyle oluncada saat kısmını kaale almıyor.

MsSQL de Tarih+saat Büyük Tarih+Saat ten küçük gibi bir komut kullanamıyormuyuz.

Yoksa Yanlış sonuç çıkıyor bende yeni farkettim.
:roll:

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ı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Saatlerde olduğu gibi >= ve <= neden denemiyorsun :wink:

Kod: Tümünü seç

((BTarih >= '01.01.2006') AND (BSaat >= '08:00')) OR
   ((Tarih <= '01.02.2006') AND (BSaat <= '08:00'))
Ayrıca parantezleri yanlış kullanmışsın :!: OR dan öncesi ve sonrası bir bütün olarak sonuç vermeli :wink:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
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;
Recep hocam dediğin şekildede yaptım aşağıdaki şekildede yaptım.
Ama nafile :cry:

Kod: Tümünü seç

SELECT MalKodu,Miktar,Kod13,Kod14,Kod7,Kod11,Miktar2,Tutar2,Miktar3, 
BlkMiktar,Tutar3,PromosyonMiktar,Kod12,BarkodNo,BTarih, BSaat  FROM Barkod 
Where(BTarih Between '14.02.2006' and  '15.02.2006') and 
( ((BTarih >= '14.02.2006') and  (BSaat>= '08:00:00')) or  
((BTarih <= '15.02.2006') and  (BSaat<= '08:00:00')) ) and 
Kod1='True' Order by BTarih,Bsaat Desc
Bu şekilde yaptığımda gün olaraka doğru getiriyor fakat saat kısmını hatalı veriyor hocam.

Yukarıdaki sorguda yapılmak istenen 14.02.2006 tarihindeki 08:00:00 dan başlayan ve 15.02.2006 08:00:00 kadar süren üretimi listelemesi gerekiyor ama böyle yapmıyor.

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]
_________________
Cevapla