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ı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

Şöyle birşey yazdım, bir bak, bu şekilde çalıştır, işine yarıyorsa kendi kodlarına çevirirsin.

Kod: Tümünü seç

DECLARE @TS DATETIME,@TS2 DATETIME

SELECT @TS=CONVERT(DATETIME,'2006-03-14 08:00:00',120),@TS2=CONVERT(DATETIME,'2006-03-15 08:00:00',120)

SELECT (CASE WHEN CONVERT(DATETIME,GETDATE(),120) BETWEEN @TS AND @TS2 THEN 'ARADA' ELSE 'DEGIL' END)

iki değişken tanımladım datetime tipinde, tarih+saat için convertte "120" tipinini kullandım. Bunun anlamı: yyyy-mm-dd hh:mi:ss(24h) (bkz ms sql server help / convert). Sonra verdiğim tarih+saati (ben getdate kullandım sen burda tablondaki tarih+saat alanını kullanacaksın) de aynı şekilde çevirdim. between ile de arada olup olmadığına baktım. Bu şekilde çalıştı, işini görür umarım.
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

SQL'i şu şekilde düzeltirseniz çalışacaktır:

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 > '14.02.2006' and BTarih < '15.02.2006') or
       (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
İyi çalışmalar.
Kullanıcı avatarı
ofenX
Üye
Mesajlar: 397
Kayıt: 09 Nis 2005 10:24
Konum: Diyarbakır
İletişim:

Mesaj gönderen ofenX »

Merhaba,

Bildiğiniz gibi tarih bir float türünde bir bilgidir. İstediğiniz alanı tarih değil de özüne giderek neden almayalım ki?

Aşağıdaki örnekten yola çıkarak bir deneme yapın. Yalnız benim verdiğim örnek normal tarih içindir. Daha önceki mesajlarda sizin program saati farklı bir şekilde alıyordu.

Kod: Tümünü seç

DECLARE @ILKTARIH DATETIME
DECLARE @SONTARIH DATETIME
SET @ILKTARIH ='10.10.2005 08:00:00'
SET @SONTARIH='10.11.2005 08:00:00'

SELECT * 
FROM SAYILAR 
WHERE CONVERT (DOUBLE PRECISION, TARIH)>=CONVERT(DOUBLE PRECISION , @ILKTARIH) AND 
    CONVERT (DOUBLE PRECISION ,TARIH)<=CONVERT(DOUBLE PRECISION, @SONTARIH)


dikkat ederseniz. ben convertte Türkçe'ye göre tarih girmemişim. İskelet olduğu için bunlara önem vermedim.
Yukarıdaki örnekte 'aa/gg/yy ss:dd:ss' şeklinde kaydetmiş. Siz uygun şekle getirirsiniz.

Between ile de aşağıdaki gibi alabilirsiniz.

Kod: Tümünü seç

DECLARE @ILKTARIH DATETIME
DECLARE @SONTARIH DATETIME
SET @ILKTARIH ='10.10.2005 08:00:00'
SET @SONTARIH='10.11.2005 08:00:00'

SELECT * 
FROM SAYILAR 
WHERE CONVERT (DOUBLE PRECISION, TARIH) 
BETWEEN CONVERT(DOUBLE PRECISION , @ILKTARIH) AND 
              CONVERT(DOUBLE PRECISION, @SONTARIH)




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;
Değerli yorum ve görüşlerinizden dolayı Hepinize Ayrı ayrı teşekkür ediyorum.

Tüm yapıları inceledim @Hakan Can verdiği kod ile oldu :oops:
Olmayınca olmuyor çok garip bir sorgu tipiydi sayenizde çözmüş oldum.

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

Mesaj gönderen fduman »

MS SQL'in ne kadar acaip olduğunu da bu sayede öğrenmiş oldum. Timestamp işlemi yapılmaz mı yahu? :roll:
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 »

Belki haklısın coderlord :?

Ama ben Mecburum :D

Yakında Oracle Geçiyoruz ama zamanla tabi birden değil.

Bence bu timestamp alan kullanılıyordur hatta güneş prog veri atıyor biz bilmiyoruz gibi geldi bana.

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 »

Merak ettiğim için soruyorum, @Hakan Can'ın verdiği şekilde iki tarih arasında birden fazla gün olunca da doğru çalıştı mı? Çünkü BTarih de sadece tarih bilgisi varsa where deki (BTarih > '14.02.2006' and BTarih < '15.02.2006') kısmının bir anlamı yoktur. 14.02.2006 ile 15.02.2006 arasında herhangi başka bir gün yoktur. Diğer iki satır üstteki satırı da kapsayacak şekilde daha önce söylediğim >= ve <= kullanılarak tekrar düzenlenebilir gibime geliyor. Yani;

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 >= '14.02.2006' and  BSaat >= '08:00:00') or
      (BTarih <= '15.02.2006' and  BSaat <= '08:00:00')
Order by BTarih,Bsaat Desc
Burada da şöyle bir sorun ortaya çıkar. Diyelim sen üç günlük rapor alacaksın. O zaman 08:00:00 deyince bir sonraki günün 00:00:00 dan 08:00:00 a kadar olan kayıtları sorguya dahil olmayacaktır :idea: TimeStamp desteği olması halinde olay tek bir where BTarih beetween Ilk_TarihStamp and Son_TarihStamp şekli ile çözmek mümkündü.

Sonuç olarak bir sonraki tüm saatleri kapsayacak şekilde değiştirilebilir;

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 >= Ilk_Tarih and (BSaat >= '08:00:00' or (BTarih > Ilk_Tarih and BTarih < Son_Tarih))) or
      (BTarih <= Son_Tarih and (BSaat <= '08:00:00' or (BTarih < Son_Tarih and BTarih > Ilk_Tarih)))
Order by BTarih,Bsaat Desc
şeklinde gittikçe karışan bir halde çözülebilir :lol:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

MS SQL'de DATETIME veri tipi var ve FireBird'deki TIMESTAMP'e karşılık geliyor.
Aslında iki alan yerine bir alan yapıp BETWEEN'le bu işi halletseydiniz sorunu kökünden halletmiş olacaktınız.
Ayrıca MS SQL'de TIMESTAMP farklı bir veri tipi. Help'inde gerekli açıklama var.

İyi çalışmalar.
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Date ve time içeren alanları birleştirip cast edip datetime'a dönüştürmeyi desteklemiyor mu peki? Sorgu bu şekilde kurulamaz mı?
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

Anlaşılan kimse benim cevabımı incelememiş :) Aslında dediğiniz şeyi yazmıştım ama tam olarak pro_imajın işine yarayacak şekle dönüşmüş hali aşağıda:

Kod: Tümünü seç

SELECT     *
FROM        TABLO
WHERE     (CONVERT(DATETIME, BTarih + BSaat, 120) BETWEEN '01.01.2006 08:00' AND '01.02.2006 08:00')
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Gözden kaçırmışız naile. :)

Ee böyle daha güzel. Bunu neden kullanmadık sahiden?
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

Bilmem kullanana sormak lazı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 »

Recep abi kafam iyice karıştı ya acaip moralim bozuldu Sağlıklı çalıştığını dün test ettim ama bir kez daha bakayım belki bişeyleri atlıyordur.

Peki biz tarih ve saat alanını birleştirebilmiyiz yani sorgulama yaparken timestamp gibi kullanmak mümkün değil galiba. :roll:
:oops:

Sağlık olsun bu konuyu tam anlmıyla araştırmak gerekiyor galiba.
Yardımlarınız ve desteğiniz için tşk. ederim ben araştırayım.
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 »

Destekliyor. Hatta bir dünya DateTime fonksiyonu var.
Ancak ben şahsen böyle bir problemi her halükarda ilk tavsiye ettiğim yöntemle çözüyorum. (Tamamen sayısala çevirip BETWEEN kullanarak)
Zira DateTime'ı alfasayısal belirtmek çoğu yerde sorun oluyor. İşletim sistemine, veritabanı ayarlarına göre vs. bazen yıl başta, bazen sonda; bazen ay ortada, bazen başta.

İyi çalışmalar.
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

Aslında CONVERT bütün sorunları çözüyor, ayrıyeten sayısala çevirmeye bence gerek yok. Ben delphi tarafında genelde parametre,parametre olmazsa da CONVERT kullandığım için hiç bir sorunla karşılaşmadım şimdiye kadar.
Cevapla