yaş aralığı hesaplama
yaş aralığı hesaplama
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.
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.
Kod: Tümünü seç
select (birthday-current_date),count(1) from tablo
where not (birthday is null)
Group by 1


.-.-.-.-.-.-.-. ^_^
- sabanakman
- Kıdemli Üye
- Mesajlar: 3081
- Kayıt: 17 Nis 2006 08:11
- Konum: Ah bi Antalya olaydı keşke (Ankara)
Yaş
Mrb; Direk TCalculateField ile yapılsa olmazmı mesela
gibi bir kod yaşı hesaplamaya yarar. Gerçi en sondaki +1 meselesi tartışılabilir.
Kolay gele.
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;

Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .
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.
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.
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
Ş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
Logo Go özel eğitim, web tasarım, teknik servis
EXTRACT fonksiyonunu kullanarak isteğinizi direk yerine getirebilirsiniz:
İyi çalışmalar.
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
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.
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.
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.
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
Bunu mesajı atan arkadaşımız cevaplayabilir. Bize örnek verseydi, problemini daha iyi çözüme kavuşturabilirdik.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.
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
Logo Go özel eğitim, web tasarım, teknik servis
@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.
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
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
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ü:
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?
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.
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?