yaş aralığı hesaplama

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Kullanıcı avatarı
y.kulac
Üye
Mesajlar: 276
Kayıt: 08 Kas 2003 12:03
Konum: serdivan/sakarya

yaş aralığı hesaplama

Mesaj gönderen y.kulac »

s.a.
firebird 1,5 vt kullanıyorum. veritabanında yaklaşık 50.000 civarı kayıt var.
doğum tarihinine göre yaş aralıklarını sorguluyorum. sorulama yaparken önce bütün kayıtların yaşlarını tekrar hesaplattırıyorum. hesaplama işinden sonra ilgili yaşları buluyorum.

ama yaşları her seferinde tekrar hesaplatıyorum. çünkü değişmiş olabilir.
50.000 kayıt her seferinde baştan sona döngü ile kontrol edilip yaşlar hesaplanıyor. bu ise zaman kaybına neden oluyor. bu işin daha kısa bir yolu var mıdır.?

iyi çalışmalar.
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

tablona yas diye bir alan ekle, bir seferlik 50000 kayıt icin yas hesaplayan update sql i calıstır, sonra eklenecekler icin before insert ve before update triggerlarında yas hesaplaması yap
bu alanı artan ve azalan sekilde indexle
group by kullanarak sorgularını dene...
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
y.kulac
Üye
Mesajlar: 276
Kayıt: 08 Kas 2003 12:03
Konum: serdivan/sakarya

Mesaj gönderen y.kulac »

tabloda yas diye bir alan var. bir kerelik yaşı hesapladım diyelim. peki 5 ay sonra kişinin yaşı değişiyorsa eski hesapladığımız gibi kalmaz mı . sonuçta tekrar bütün yaşların güncellenmesi gerekir. güncelleme işide kayıt bazında olacağı için bütün kayıtların tek tek kontrol edilmesi gerekmiyor mu?
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

o zaman dun doğum günü olanların bir listesini alıp onların yasını hesaplattıracaksın. programın yada ekranın her acılısında bu kontrolu yaparsan cok fazla zaman almayabilir.
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
mege
Admin
Mesajlar: 2360
Kayıt: 05 Şub 2004 04:32
Konum: Beşiktaş
İletişim:

Mesaj gönderen mege »

Kod: Tümünü seç

select (birthday-current_date),count(1) from tablo
where not (birthday is null)
Group by 1
gibi birşeyle yapılır, tabi field numarası 1 değil 0 da olabilir emin değilim tam hatırlayamadım şimdi :? having 1 in(15..29) gibi birşeylede aralık çekilir vs.. denemek lazım :)
.-.-.-.-.-.-.-. ^_^
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
aynı sıkıntı ile bizde uğraşmıştık.
yaşı hesaplayan bir udf hazırladık.
sonra tabloya calc alan ekledik.
doğum tarihine göre yaşını hesaplattık.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Yaş

Mesaj gönderen sabanakman »

Mrb; Direk TCalculateField ile yapılsa olmazmı mesela

Kod: Tümünü seç

procedure TForm1.ListeCalcFields(DataSet: TDataSet);
var Gun:Integer;
begin
  Gun:=Trunc(Date-ListeDogtar.AsDateTime);
  ListeYas.AsInteger:=(Gun div 365)+1;
end;
gibi bir kod yaşı hesaplamaya yarar. Gerçi en sondaki +1 meselesi tartışılabilir. :D Kolay gele.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

eğer delphi tarafından hesaplayım diyorsanız datautils deki yearsbetween fonkisyonunu kullanabilirsiniz
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
ofenX
Üye
Mesajlar: 397
Kayıt: 09 Nis 2005 10:24
Konum: Diyarbakır
İletişim:

Mesaj gönderen ofenX »

Merhaba,
Sorgulama yaptığınızı söylemiştiniz. Bu işi tersten yapsanız olmaz mı?
Şöyleki :
Yaş hesaplama işine girmeden direk doğum tarihine göre sorgu alsanız.

Örneğin ben 2004 yılında 31 yaşındaydım. 2006 da 33 yaşındayım.

Mesela 2006 yılında 30-35 yaş aralığını sorgulayacaksınız. 2006-30=1976
2006-35=1971 doğumlu olur.

Kod: Tümünü seç

   select * from tablo 
     where dogtarihi between 1971 and 1976 

gibi bir yapı kullanırsanız yine istediğinizi verir. Yukarıda syntax uyumunu göz ardı ettim. yaş aralığını da hesaplayıp parametre ile girerseniz bence alabilirsiniz.
Şu an internet kafede olduğumdan deneme yapamıyorum. Ama bence bu daha hızlı olur.

Kolay gelsin.
http://www.aysbergbilgisayar.com
Logo Go özel eğitim, web tasarım, teknik servis
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

eğer yaş için sadece yıla bakıyorsanız tamam ama işin içine ay ve günü soktuğunuz zaman işler birazdaha karışık oluyor.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

EXTRACT fonksiyonunu kullanarak isteğinizi direk yerine getirebilirsiniz:

Kod: Tümünü seç

CREATE TABLE PERSONEL (
  ADI_SOYADI VARCHAR(50) NOT NULL,
  DOGUM_TARIHI TIMESTAMP,
  YASI COMPUTED BY (EXTRACT(YEAR FROM CURRENT_TIMESTAMP) - EXTRACT(YEAR FROM DOGUM_TARIHI)),
PRIMARY KEY (ADI_SOYADI));

veya COMPUTED BY alanı olmadığını varsayalım:

SELECT
  ADI_SOYADI,
  EXTRACT(YEAR FROM CURRENT_TIMESTAMP) - EXTRACT(YEAR FROM DOGUM_TARIHI) AS YASI
FROM PERSONEL
İ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,
Dün internet kafede olduğum için deneme yapamamıştım. Size bir örnek hazırladım. Hakan Can arkadaşımızın dediği gibi Extract ile haşır neşir olacağız.

Yukarıdaki mesajıma ithafen aşağıdaki kod kullanılabilir.

Kod: Tümünü seç

 select * from isci
    where
      Cast(extract(year from dogum_tarihi) as integer )
   between 
     cast(extract(year from current_date )as integer)-35

    and
     cast(extract(year from current_date )as integer)-30

Yukarıdaki örnekte bir stored procedure kullanırsanız yaş aralığını da parametre ile girebilirsiniz. Delphi tarafında yapıyorsanız zaten yine parametre olarak kullanabilirsiniz.
aslangeri yazdı:eğer yaş için sadece yıla bakıyorsanız tamam ama işin içine ay ve günü soktuğunuz zaman işler birazdaha karışık oluyor.
Bunu mesajı atan arkadaşımız cevaplayabilir. Bize örnek verseydi, problemini daha iyi çözüme kavuşturabilirdik.

Kolay gelsin.

**** Edit
Cast kullanmadan da sonuç veriyor. Çıkarma işlemini yapmak için Cast kullanmıştım. Ama cast olmadan da aynı sonucu veriyor.
http://www.aysbergbilgisayar.com
Logo Go özel eğitim, web tasarım, teknik servis
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

Mesaj gönderen nitro »

aslangeri yazdı:s.a.
aynı sıkıntı ile bizde uğraşmıştık.
yaşı hesaplayan bir udf hazırladık.
sonra tabloya calc alan ekledik.
doğum tarihine göre yaşını hesaplattık.
bu udf'yi paylaşmanız mümkün mü?
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

@nitro;
malesef mümkün değil. ticari bir uygulama için kullandığımız bir udfyi yayınlamam doğru olmaz.
ancak udf hazırlarken takıldığınız yer olursa elimden geldiğince yardımcı olmaya çalışırım.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

Mesaj gönderen nitro »

http://www.fbtalk.net/ViewTopic.aspx?id=150
burada bu hesaplamayı yapan procedure var. söz konusu procedure'u update-insert triggerında çalıştırıyorum, ve hesaplamadan çıkan sonucu tabloya yazıyorum ama hata veriyor.
recursive fonksiyon olduğu için. çünkü:

Kod: Tümünü seç

eğer tablo update edilirse yaşı hesapla tabloyu update et. 
gibi bir olay söz konusu.

EDİT:
viewtopic.php?t=16594&highlight=udf
bu topik'i inceledim.
bu kadar veri varken ben bu işi yaparım.
ama bilmek istediğim birşey var.
bunu yaparsam ben hiç bir şey yapmadan, veritabanındaki yaşlar sürekli güncel kalacak mı? mesela 1 yıl veritabanını ve programı hiç açmadık. haliyle bütün yaş değerlerinin değişmiş olması lazım. 1 yıl sonra veritabanını ibexpert ile açtığım zaman bana güncel yaş değerlerini verecek mi? yoksa programın exesini çalıştırmak mı gerekece bu güncel yaş değerlerini elde etmek için?
UDFyi veya bu hesaplama mekanizmasını tetikleyen nedir?
Cevapla