40.000 kayıtın yaşını hesaplama ?
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
- delphi.net
- Üye
- Mesajlar: 67
- Kayıt: 01 Nis 2007 05:30
- Konum: mUĞLa
40.000 kayıtın yaşını hesaplama ?
merhaba arkadaşlar
firebird veri tabanında 40.000 kayıt var ve bu kişilerin yaşlarının hesaplanması günde bir kez yapılması gerekmekte en hızlı şekilde bu işlemi nasıl yapabiliriz ? sql mi yoksa ek bi programı mı yazmalıyız forumda arama yaptım ama yeterli bi cvp bulamadım ....
firebird veri tabanında 40.000 kayıt var ve bu kişilerin yaşlarının hesaplanması günde bir kez yapılması gerekmekte en hızlı şekilde bu işlemi nasıl yapabiliriz ? sql mi yoksa ek bi programı mı yazmalıyız forumda arama yaptım ama yeterli bi cvp bulamadım ....
olayında tercih konusu nedir anlamadım ?sql mi yoksa ek bi programı mı yazmalıyız
- Forumda ne tür bir arama kriteri kullandığını da merak ettim. "40000 kayıtta yaş bulma" şeklinde değil herhalde ?

- Bir SQL kodu ile bunu yapma imkanın var ancak tam olarak ne istediğini ifade edememişsin...
1. Belirli bir yaşta olanların listesi mi isteniyor ?
2. Her yaş grubundan kaçar kişi olduğunu görmek mi isteniyor ? Yani istatistiki bir bilgi mi istenen ?
3. Tüm kayıtların dökümü her gün yapılıyor mu ki her kaydın sonuna yaş görünsün isteniyor ? Neden 40000 ifadesi kullandın ? Gösterilen kayıt kadarını da gösterme sırasında hesaplatabilirsin ondan sordum.
4. Yaş aralıkları var da o yaş aralığındaki kişilerin listesi mi isteniyor ?
- Bak benim aklıma hemen 4 soru geldi ? Şimdi soruyu soran sen olduğuna göre bir dahaki sefere daha açık ifade kullanırsan kafamızda oluşan bu sorular yerine çabuk bir cevap bulabilirsin.

- delphi.net
- Üye
- Mesajlar: 67
- Kayıt: 01 Nis 2007 05:30
- Konum: mUĞLa
veri tabanında diyelimki
doğum tarihi : yaş : olmak üzere iki tane alan var
yaklaşık 40.000 tane bu veri tabanına kayıtlı doğum tarihi ve yaş alanları var bunların yaş bilgilerinin sürekli olarak güncellenmesi gerekmekte... yani tercih konusu olarak ek program yada sql farketmez yeterki kısa sürede işi halletsin en uygun şu olur şeklinde sizin fikrinizi ve birazda bilginizi almak istiyorum ? (arama kriteri olarak ta "yaş" olarak bi arama yaptım... bazı açıklamalar var udf den falan bahsetmiş ama bişi anladım açıkçası)... (program yeşil kart bürlorında kullanılıyor günlük olarak yaş bilgilerinin güncellenmesi gerekmekte)
kısacası kayıtlı kişilerinin yaşları hesaplanacak...
inş. kafanızda tek bir soru oluşmuştur şimdi
doğum tarihi : yaş : olmak üzere iki tane alan var
yaklaşık 40.000 tane bu veri tabanına kayıtlı doğum tarihi ve yaş alanları var bunların yaş bilgilerinin sürekli olarak güncellenmesi gerekmekte... yani tercih konusu olarak ek program yada sql farketmez yeterki kısa sürede işi halletsin en uygun şu olur şeklinde sizin fikrinizi ve birazda bilginizi almak istiyorum ? (arama kriteri olarak ta "yaş" olarak bi arama yaptım... bazı açıklamalar var udf den falan bahsetmiş ama bişi anladım açıkçası)... (program yeşil kart bürlorında kullanılıyor günlük olarak yaş bilgilerinin güncellenmesi gerekmekte)
kısacası kayıtlı kişilerinin yaşları hesaplanacak...
inş. kafanızda tek bir soru oluşmuştur şimdi

- Kabaca bir yaş hesabı ise (yani yılların farkı) şu SQL komutu işini görecektir
dediğinde "ad" "soyad" ve "yas" haneleri göreceksin. Eğer işini görüyorsa cevabın budur. Aksi halde bunu "UPDATE TABLE" komutu ile başlayan bir SQL komut dizisi işini görecektir.
- Ayrıca bu işlemler dinamik olabilecek iken neden veritabanında güncelleme gereği duyduğunu bilmediğimden yorum yapamıyorum...
Kod: Tümünü seç
SELECT ad, soyad, (Year(Date())-Year(DogumTarihi)) AS yas FROM Tablo
- Ayrıca bu işlemler dinamik olabilecek iken neden veritabanında güncelleme gereği duyduğunu bilmediğimden yorum yapamıyorum...
- delphi.net
- Üye
- Mesajlar: 67
- Kayıt: 01 Nis 2007 05:30
- Konum: mUĞLa
Merhaba,
Sorunum aynı olduğu için yeni başlık açmak istemedim. Tabloya ilk veri girişinde
şeklinde yine forumdan bulduğum kodlar ile kişinin yaş hesabını yaptırarak tabloya yazdırıyorum. buraya kadar her şey normaldi fakat kullanıcı güncel yaşı ile sorgulama ve bu sorgununda iki ayrı yaş aralığı olarak istemesi üzerine iki saati aşkındır forumda dolanıyorum. bir çok yöntem gördüm ve udf ile daha güzel olduğunu anladım ama nafile bilgim o derece iyi değil. calc alan oluşturdum ve yaş yılını calc alanda hesaplattım ama ayrı bir formda Query ile yapılan yaş aralığı sorgusunda calc alanı göremiyor ve sonuç alamıyorum.
kafamda yaş için yıl, ay, gün alanlarını sistem tarihi ile güncellemek var ama nasıl yapacağımı kurgulayamadım. yol gösterme adına bir ipucu verebilirmisiniz. zira soruyu ilk soran arkadaşım sorununu çözdüğünü belirtmiş ama nasıl çözdüğünü açıklayıcı olarak yazmamış.
kolay gelsin
Sorunum aynı olduğu için yeni başlık açmak istemedim. Tabloya ilk veri girişinde
Kod: Tümünü seç
procedure TFrmSicilKayitGirisi.cxDBDateEdit2Exit(Sender: TObject);
var
islem,gun,ay,yil:integer ;
artiklar:integer;
basyili,basAyi,basGunu,bitYili,bitAyi,bitGunu:word;
begin
if sicilverigirisdm.sicilgirisIBDSet.State in [dsinsert, dsedit] then
begin
artiklar:=0;
decodedate(trunc(cxdbdateedit2.Date),basyili,basayi,basgunu);
decodedate(trunc(date),bityili,bitayi,bitgunu);
if isleapyear(basyili) then artiklar:=artiklar+1;
artiklar:=artiklar+trunc((bityili-basyili)/4);
islem := trunc(date) - trunc(cxdbdateedit2.Date);
islem:=islem-((bityili-basyili)*5)-artiklar;
gun := islem mod 30; //her ayın 30 gün olduğu kabul edildi.
ay := (islem div 30) mod 12;
yil := (islem div 30) div 12;
sicilverigirisdm.sicilgirisIBDSet.FieldByName('YGUN').AsInteger:=gun;
sicilverigirisdm.sicilgirisIBDSet.FieldByName('YAY').AsInteger:=ay;
sicilverigirisdm.sicilgirisIBDSet.FieldByName('YYIL').AsInteger:=yil;
end;
end;
kafamda yaş için yıl, ay, gün alanlarını sistem tarihi ile güncellemek var ama nasıl yapacağımı kurgulayamadım. yol gösterme adına bir ipucu verebilirmisiniz. zira soruyu ilk soran arkadaşım sorununu çözdüğünü belirtmiş ama nasıl çözdüğünü açıklayıcı olarak yazmamış.
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.

Merhaba,
Biraz tırmalayınca oluyor sanırım. Bu tırmalama alışkanlığını veren forum üyelerine teşekkür ederim.
şeklinde sistem tarihi ile yıl, ay, gün olarak yaşını güncelledim. Yalnız burada eleştirilerinizi bekliyorum. ne kadar sağlıklı bir yapı. ne kadar yavaş veya hızlı çalışan yöntem. ileride sorun oluşabilirmi. elimde yeteri kadar vt ye girecek veri yok bu yüzden tavsiyelerinizi bekliyorum.
kolay gelsin
Biraz tırmalayınca oluyor sanırım. Bu tırmalama alışkanlığını veren forum üyelerine teşekkür ederim.
Kod: Tümünü seç
procedure TFrmSplash.cxButton1Click(Sender: TObject);
var
islem,gun,ay,yil:integer ;
artiklar:integer;
basyili,basAyi,basGunu,bitYili,bitAyi,bitGunu:word;
begin
try
sicilverigirisdm.ArsivLogIBDSet.Active:=true;
sicilverigirisdm.SicilGirisIBDSet.Active:=true;
sicilverigirisdm.SicilGirisIBDSet.First;
while not sicilverigirisdm.SicilGirisIBDSet.Eof do
begin
sicilverigirisdm.SicilGirisIBDSet.Edit;
artiklar:=0;
decodedate(trunc(sicilverigirisdm.SicilGirisIBDSet.fieldbyname('DOGUM_TARIHI').AsDateTime),basyili,basayi,basgunu);
decodedate(trunc(date),bityili,bitayi,bitgunu);
if isleapyear(basyili) then artiklar:=artiklar+1;
artiklar:=artiklar+trunc((bityili-basyili)/4);
islem := trunc(date) - trunc(sicilverigirisdm.SicilGirisIBDSet.fieldbyname('DOGUM_TARIHI').AsDateTime);
islem:=islem-((bityili-basyili)*5)-artiklar;
gun := islem mod 30; //her ayın 30 gün olduğu kabul edildi.
ay := (islem div 30) mod 12;
yil := (islem div 30) div 12;
sicilverigirisdm.sicilgirisIBDSet.FieldByName('YGUN').AsInteger:=gun;
sicilverigirisdm.sicilgirisIBDSet.FieldByName('YAY').AsInteger:=ay;
sicilverigirisdm.sicilgirisIBDSet.FieldByName('YYIL').AsInteger:=yil;
sicilverigirisdm.SicilGirisIBDSet.Post;
sicilverigirisdm.SicilGirisIBDSet.Next;
end;
finally
sicilverigirisdm.SicilGirisIBDSet.Active:=false;
sicilverigirisdm.ArsivLogIBDSet.Active:=false;
end;
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.

merhaba,
@mudipasa ustam doğru söylersin. bu şekilde çok uzun süreceği belli. hele birde ileride 150 000 bin kayıt girilecek ve her geçen gün artıyor. tırmalamadan bahsetmiştim, update sql içerisine kafamda yukarıda verdiğim yıl, ay, gün işlemini yerleştiremedim ve geçici olarak bu yöntemi seçtim.
bir ipucu ile update sql içerisine yıl, ay, gün hesaplamayı gömmeyi gösterebilirse ustalar gayet güzel olacak.
teşekkür ve saygı ile
kolay gelsin
@mudipasa ustam doğru söylersin. bu şekilde çok uzun süreceği belli. hele birde ileride 150 000 bin kayıt girilecek ve her geçen gün artıyor. tırmalamadan bahsetmiştim, update sql içerisine kafamda yukarıda verdiğim yıl, ay, gün işlemini yerleştiremedim ve geçici olarak bu yöntemi seçtim.
bir ipucu ile update sql içerisine yıl, ay, gün hesaplamayı gömmeyi gösterebilirse ustalar gayet güzel olacak.
teşekkür ve saygı ile
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.
