Tarih Aralığı Sorgulama
Tarih Aralığı Sorgulama
Merhaba,
tablo da
...
...
rapor_bas_tarihi: 01.07.2005
rapor_bit_tarihi: 01.09.2005
bunu,
tarih aralığında sorguladığımda,
select *
from TABLO_ADI
where rapor_bas_tarihi between '01.01.2005' and '01.12.2005'
şeklinde buluyor,
ancak, istenilen '01.08.2005','15.08.2005'
tarih aralığını sorgulamak istediğimde;
select *
from TABLO_ADI
where rapor_bas_tarihi between '01.08.2005' and '15.08.2005'
şeklinde bulamıyor,
bu tarih aralığını alabilmek için nasıl bir sql ifade kullanmalıyım.
teşekkürler,
vt:FB
tablo da
...
...
rapor_bas_tarihi: 01.07.2005
rapor_bit_tarihi: 01.09.2005
bunu,
tarih aralığında sorguladığımda,
select *
from TABLO_ADI
where rapor_bas_tarihi between '01.01.2005' and '01.12.2005'
şeklinde buluyor,
ancak, istenilen '01.08.2005','15.08.2005'
tarih aralığını sorgulamak istediğimde;
select *
from TABLO_ADI
where rapor_bas_tarihi between '01.08.2005' and '15.08.2005'
şeklinde bulamıyor,
bu tarih aralığını alabilmek için nasıl bir sql ifade kullanmalıyım.
teşekkürler,
vt:FB
Selamlar,
Soruyu güzel açıklamaya çalışmışsınız ama atladığınız bir şey olmuş. Bulamıyor derken bir hata veriyor mu? Veriyorsa nedir?
Ben size bu tür tarih olaylarında düşülen en büyük hatalardan birinin de tarih formatı (biçimi) olduğunu hatırlatarak başlayayım.
Sunucunuzun tarih formatı nedir? Büyük ihtimalle sorgulamada sunucunun kullandığı tarih biçimi aa.gg.yyyy şeklindedir, ancak siz sorgulamanızda gg.aa.yyyy şeklinde gönderiyorsunuz. Tabi bu durumda sunucu 15. ay olmayacağı için işleminizi gerçekleştirmiyor.
Şimdi gelelim tavsiyemize,
Bu tür durumlarda Parametre kullanılması her zaman tavsiye olunur. Zira sunucunun tarih formatını bilemeyebilirsiniz. Eğer sorgunuzu parametrik hazırlarsanız bir sorun yaşamazsınız
Örnek - 1;
Örnek - 2;
Bu tür durumlarda sadece gün ay yıl dizimleri dışında tarih ayıracında da sorun çıkabiliyor. Tarih ayıracı olarak / veya . kullanılabildiği gibi bunların dışında da birşeyler kullanılabilir. Bu da sizin SQL hata kodu almanıza sebep olur. Bu sebeple tarih alanlarını parametre olarak tanımlayı değer atılması en sağlıklı yöntemlerden biri olarak kullanılabilir.
Bunların dışında, sayısal alanlarda, noktalı sayılarda da bu tarz sorunlarla karşılaşılmaktadır. Bu durumlar içinde aynı şekilde . veya , kullanımı ve bu bullanımın, makinadan makinaya değişiyor olması da programlarda çeşitli hatalara yol açmaktadır. Bunu önlemek için de aynı yöntem kullanılarak (yani parametre olarak tanımlanarak) aşılabilir ve programın sorunsuz bir şekilde farklı biçimler kullanılan yerde eşlenik ve doğru çalışması sağlanır.
Kolay Gelsin
Soruyu güzel açıklamaya çalışmışsınız ama atladığınız bir şey olmuş. Bulamıyor derken bir hata veriyor mu? Veriyorsa nedir?
Ben size bu tür tarih olaylarında düşülen en büyük hatalardan birinin de tarih formatı (biçimi) olduğunu hatırlatarak başlayayım.

Sunucunuzun tarih formatı nedir? Büyük ihtimalle sorgulamada sunucunun kullandığı tarih biçimi aa.gg.yyyy şeklindedir, ancak siz sorgulamanızda gg.aa.yyyy şeklinde gönderiyorsunuz. Tabi bu durumda sunucu 15. ay olmayacağı için işleminizi gerçekleştirmiyor.
Şimdi gelelim tavsiyemize,
Bu tür durumlarda Parametre kullanılması her zaman tavsiye olunur. Zira sunucunun tarih formatını bilemeyebilirsiniz. Eğer sorgunuzu parametrik hazırlarsanız bir sorun yaşamazsınız
Örnek - 1;
Kod: Tümünü seç
QryTest.Close ;
QryTest.SQL.Text := 'SELECT * '
+'FROM TABLO '
+'WHERE TABLO_TARIHALANI BETWEEN :DT_BTARIH AND :DT_STARIH' ;
QryTest.ParamByName('DT_BTARIH').AsDateTime := DtpBTarih.Date ;
QryTest.ParamByName('DT_STARIH').AsDateTime := DtpSTarih.Date ;
QryTest.Open ;
Kod: Tümünü seç
QryTest.Close ;
QryTest.SQL.Text := 'SELECT * '
+'FROM TABLO '
+'WHERE TABLO_TARIHALANI >= :DT_BTARIH AND TABLO_TARIHALANI <= :DT_STARIH' ;
QryTest.ParamByName('DT_BTARIH').AsDateTime := DtpBTarih.Date ;
QryTest.ParamByName('DT_STARIH').AsDateTime := DtpSTarih.Date ;
QryTest.Open ;
Bunların dışında, sayısal alanlarda, noktalı sayılarda da bu tarz sorunlarla karşılaşılmaktadır. Bu durumlar içinde aynı şekilde . veya , kullanımı ve bu bullanımın, makinadan makinaya değişiyor olması da programlarda çeşitli hatalara yol açmaktadır. Bunu önlemek için de aynı yöntem kullanılarak (yani parametre olarak tanımlanarak) aşılabilir ve programın sorunsuz bir şekilde farklı biçimler kullanılan yerde eşlenik ve doğru çalışması sağlanır.
Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Selamla,
O zaman o tarih aralığında o kayıtlar yoktur. Eğer kayıt var ama hala görülmüyor ise bence oluşan SQL'i bir incelemek lazım. Oluşan SQL'i tam olarak yazarsanız biz de göz atarız.
Kolay Gelsin
O zaman o tarih aralığında o kayıtlar yoktur. Eğer kayıt var ama hala görülmüyor ise bence oluşan SQL'i bir incelemek lazım. Oluşan SQL'i tam olarak yazarsanız biz de göz atarız.
Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Bakın yanlış anlaşılmasın, doğru anlaşılması için tekrar ediyorum.
01.08.2005 tarihi ile 15.08.2005 Tarihi arasında (rapor_bas_tar'dan bahsediyorum) kayıt olduğuna emin misiniz?
Tabloda kayıt olabilir bu sorun değil, dikkat edin, o tarihler arasında o kayıtlar var mı? Gözünüzle görüyor musunuz? Bir yerden
SELECT *
FROM TABLO_ADI
ORDER BY rapor_bas_tar
diyerek bir SELECT çekin sonra kayıtları gözden geçirin.
Hala var olduğunu görüyorsanız sorun başkadır demektir. Zira normal bir SELECT çekiyorsunuz, karmaşık bir sorgu değil, JOIN yok düz bir SELECT çekiyorsunuz.
Bunda hata olması pek olası görülmüyor!
Kolay Gelsin
01.08.2005 tarihi ile 15.08.2005 Tarihi arasında (rapor_bas_tar'dan bahsediyorum) kayıt olduğuna emin misiniz?
Tabloda kayıt olabilir bu sorun değil, dikkat edin, o tarihler arasında o kayıtlar var mı? Gözünüzle görüyor musunuz? Bir yerden
SELECT *
FROM TABLO_ADI
ORDER BY rapor_bas_tar
diyerek bir SELECT çekin sonra kayıtları gözden geçirin.
Hala var olduğunu görüyorsanız sorun başkadır demektir. Zira normal bir SELECT çekiyorsunuz, karmaşık bir sorgu değil, JOIN yok düz bir SELECT çekiyorsunuz.
Bunda hata olması pek olası görülmüyor!
Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
tablo rapor
rapor_bas_tarihi: 01.07.2005
rapor_bit_tarihi: 01.09.2005
rapor tablosundan '01.08.2005'tarihi ile '15.08.2005' tarihi arası raporlu persenoli
sorgulamak istediğimde yukardaki raporu bulamıyor, ancak tarihi 01.01.2005 ile 31.12.2005
tarihi arası sorguladığımda buluyor. 01.08.2005-15.08.2005 tarih aralığı yukardaki tarihi içerdiğinden,
kapsadığından yukardaki raporlu personeli bulamıyor.
forum da aradım;
where
(baslangic=ilk and bitis=son)
or (baslangic Between ilk and son)
or (bitis Between ilk and son)
or (baslangic>ilk and bitis<son)
ise de istenilen kriteri sorgulayamadım.
rapor_bas_tarihi: 01.07.2005
rapor_bit_tarihi: 01.09.2005
rapor tablosundan '01.08.2005'tarihi ile '15.08.2005' tarihi arası raporlu persenoli
sorgulamak istediğimde yukardaki raporu bulamıyor, ancak tarihi 01.01.2005 ile 31.12.2005
tarihi arası sorguladığımda buluyor. 01.08.2005-15.08.2005 tarih aralığı yukardaki tarihi içerdiğinden,
kapsadığından yukardaki raporlu personeli bulamıyor.
forum da aradım;
where
(baslangic=ilk and bitis=son)
or (baslangic Between ilk and son)
or (bitis Between ilk and son)
or (baslangic>ilk and bitis<son)
ise de istenilen kriteri sorgulayamadım.
Database nedir? FB mi? Eğer DB Çok büyük değil ise yollar mısınız? Yada tabloları azaltıp ZIP'leyip yollar mısınız?
Çok merak ettim doğrusu.
Ancak, sorgunuzda daima Rapor_bas_Tar ile kontrol etmişsiniz !!!!
Doğru mu?
Çok merak ettim doğrusu.
Ancak, sorgunuzda daima Rapor_bas_Tar ile kontrol etmişsiniz !!!!
Doğru mu?
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
tabloda x şahsın aldığı 01.07.2005 tarihinden geçerli 60 gün raporu mevcut ve ben
01.08.2005 ile 15.08.2005 tarihleri arası raporlu personeli sorguladığımda bu x şahsı
bulamıyorum,
yani 01.08.2005 - 15.08.2005 diye kayıt yok, bu tarihler 01.07.2005 - 01.09.2005 tarihli rapor aralığında
ve ben bunu sorğulamak istiyorum.
01.08.2005 ile 15.08.2005 tarihleri arası raporlu personeli sorguladığımda bu x şahsı
bulamıyorum,
yani 01.08.2005 - 15.08.2005 diye kayıt yok, bu tarihler 01.07.2005 - 01.09.2005 tarihli rapor aralığında
ve ben bunu sorğulamak istiyorum.
merhaba,
burada sorun sanki çok küçük bir hata imiş gibi geliyor. başıma çok zaman geliyor küçücük bir nokta, yanlış aralık girişi gibi bişiler oluyor ve arayıp duruyorsun. aslında gözünün içine bakıyor hata ama göremiyorsun. böyle bir sorun var gibi çünki sorgu bir tarih aralığında çalışıyor buluyor, başka bir tarih aralığında ise (kendisini de kapsayan) çalışmıyor.
sq.clear, edilmeyebilir eski aklında kalanı tekrarlıyor olabilirmi?
birde son açıklamanızda kafam karıştı 01.07.2005 tarihinde veri girilmiş diyorsunuz ama sorguyu 01.08.2005 ile 01.09.2005 arasında yaptım diyorsunuz bir satır aşağıda 01.07.2005 ile 01.09.2005 arasında diyorsunuz. büyük ihtimalle sürçü lisan ama bu cümlelerinizde kafam karıştı gibi.
eğer kaydın girildiğini normal tablonuzda görüyor ve sorgunuzda görmüyorsanız, başka tarih aralığında görünüyorsa büyük ihtimalle küçük bir detay gözden kaçıyor demektir. misalen o tarih girilirken eğer tabloda tarihsel alan belirtilmemiş yani date değilde varchar ise ve kullanıcı 01.07.2005 yerine 01..07.2005 gibi çift noktalı (örnek) hatalı girmiş ise bulamayacaktır sorgu bunu ama göz yanılması siz kaydın düzgün girdiğini görebilirsiniz.
uzun bi lafazanlık oldu ama kusura bakmayın
kolay gelsin
burada sorun sanki çok küçük bir hata imiş gibi geliyor. başıma çok zaman geliyor küçücük bir nokta, yanlış aralık girişi gibi bişiler oluyor ve arayıp duruyorsun. aslında gözünün içine bakıyor hata ama göremiyorsun. böyle bir sorun var gibi çünki sorgu bir tarih aralığında çalışıyor buluyor, başka bir tarih aralığında ise (kendisini de kapsayan) çalışmıyor.
sq.clear, edilmeyebilir eski aklında kalanı tekrarlıyor olabilirmi?
birde son açıklamanızda kafam karıştı 01.07.2005 tarihinde veri girilmiş diyorsunuz ama sorguyu 01.08.2005 ile 01.09.2005 arasında yaptım diyorsunuz bir satır aşağıda 01.07.2005 ile 01.09.2005 arasında diyorsunuz. büyük ihtimalle sürçü lisan ama bu cümlelerinizde kafam karıştı gibi.
eğer kaydın girildiğini normal tablonuzda görüyor ve sorgunuzda görmüyorsanız, başka tarih aralığında görünüyorsa büyük ihtimalle küçük bir detay gözden kaçıyor demektir. misalen o tarih girilirken eğer tabloda tarihsel alan belirtilmemiş yani date değilde varchar ise ve kullanıcı 01.07.2005 yerine 01..07.2005 gibi çift noktalı (örnek) hatalı girmiş ise bulamayacaktır sorgu bunu ama göz yanılması siz kaydın düzgün girdiğini görebilirsiniz.
uzun bi lafazanlık oldu ama kusura bakmayın
kolay gelsin
Şefkat-u Merhamette Güneş Gibi Ol.
Başkalarının Kusurunu Örtmekte Gece Gibi Ol.
Sehavet-u Cömertlikte Akarsu Gibi Ol.
Hiddet-u Asabiyette Ölü Gibi Ol.
Tevazu-u Mahviyette Toprak Gibi Ol.
Ya Olduğun Gibi Görün Ya Göründüğün Gibi Ol.

Başkalarının Kusurunu Örtmekte Gece Gibi Ol.
Sehavet-u Cömertlikte Akarsu Gibi Ol.
Hiddet-u Asabiyette Ölü Gibi Ol.
Tevazu-u Mahviyette Toprak Gibi Ol.
Ya Olduğun Gibi Görün Ya Göründüğün Gibi Ol.

Selam
Sorun senin tarih girişinden kaynaklanıyor.
Sen Datetimepicker veya bir edit nesnesinden alabilirsin. Ama aldıgın deger sorgu içerisine gün ve ay yer değiştirilerek girilmeli
yani: tarhi=15.10.2005 ise sen sorguna tarihi 10.15.2005 şeklinde yollamalısın
.
şeklinde olmalı.
Bir function la veya şu şekilde tarihi değişebilirsin
Bunu kullanabilirsin
Sen Datetimepicker veya bir edit nesnesinden alabilirsin. Ama aldıgın deger sorgu içerisine gün ve ay yer değiştirilerek girilmeli
yani: tarhi=15.10.2005 ise sen sorguna tarihi 10.15.2005 şeklinde yollamalısın
.
Kod: Tümünü seç
select *
from TABLO_ADI
where rapor_bas_tarihi = '10.15.2005' and rapor_bitis_tarihi= '12.31.2005'
Bir function la veya şu şekilde tarihi değişebilirsin
Kod: Tümünü seç
rapor_bas_tarihi:=formatdatetime('mm/dd/yyyy',Time1.Date);
Kod: Tümünü seç
rapor_bitis_tarihi:=formatdatetime('mm/dd/yyyy',Time2.Date);
Kod: Tümünü seç
select *
from TABLO_ADI
where rapor_bas_tarihi = '''+rapor_bas_tarih+''' and rapor_bitis_tarihi= '''+rapor_biis_tarih+'''
A şahsın aldığı 01.07.2005 tarihinden geçerli 60 gün raporu
ben vt de rapor_bas_tarihi: 01.07.2005 ve rapor_bitiş_tarihi: 01.09.2005
olarak giriyorum.
Daha sonra 01.08.2005 ile 31.08.2005 tarih aralığındaki raporlu personel
listesini almak istediğimde bu A şahsı bana raporlu olarak vermiyordu, Oysa
sorguladığım bu Ağustos ayı A şahsın aldığı 01.07.2005-01.09.2005 tarih aralığında
select *
from TABLO_ADI
where
((rapor_bas_tarihi >= '01.08.2005' and rapor_bas_tarihi <= '31.08.2005') or
(rapor_bit_tarihi > '01.08.2005' and rapor_bit_tarihi < '31.08.2005') or
(rapor_bas_tarihi < '01.08.2005' and rapor_bit_tarihi > '31.08.2005'))
şeklinde sorguladım.
ilgilenen herkese çok
teşekkürler.
ben vt de rapor_bas_tarihi: 01.07.2005 ve rapor_bitiş_tarihi: 01.09.2005
olarak giriyorum.
Daha sonra 01.08.2005 ile 31.08.2005 tarih aralığındaki raporlu personel
listesini almak istediğimde bu A şahsı bana raporlu olarak vermiyordu, Oysa
sorguladığım bu Ağustos ayı A şahsın aldığı 01.07.2005-01.09.2005 tarih aralığında
select *
from TABLO_ADI
where
((rapor_bas_tarihi >= '01.08.2005' and rapor_bas_tarihi <= '31.08.2005') or
(rapor_bit_tarihi > '01.08.2005' and rapor_bit_tarihi < '31.08.2005') or
(rapor_bas_tarihi < '01.08.2005' and rapor_bit_tarihi > '31.08.2005'))
şeklinde sorguladım.
ilgilenen herkese çok
teşekkürler.