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ı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

Mesaj gönderen nitro »

acaba veritabanına bugün diye bir field koysam ve yaş değeri computed olarak doğumtarihi, bugün arasındaki tarih farkını hesaplasam.
bugün isimli field'i de program her çalıştığı zaman update etsem.
veritabanı ve program için ağır bir yük mü olur acaba ?

Kod: Tümünü seç

program her çalıştığı zaman git şu tablolardaki bugün isimli fieldlerin hepsine bugünün tarihini yaz. 
gibi bir kod.
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

Şuna benzer bir tablo ile işini halletmeyi denesen:

Kod: Tümünü seç

CREATE TABLE PERSONELIM2 (
  KODU INTEGER NOT NULL,
  ADI VARCHAR(20) NOT NULL,
  SOYADI VARCHAR(20) NOT NULL,
  DOGUM_TARIHI TIMESTAMP,
  YASI INTEGER COMPUTED BY ((CURRENT_TIMESTAMP - DOGUM_TARIHI) / 365),
CONSTRAINT PK_PERSONELIM2 PRIMARY KEY (KODU));
İyi çalışmalar.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
sizin bir değişiklik yapmanız gerek yok
tablonuzda yaşı alanını hesaplanan alan olarak tanımlamanız ve değerini udf den almasını sağlamanız yeterli.

Kod: Tümünü seç

YASI          COMPUTED BY (YasBul(dogumt,current_date)),
şeklinde yaptık ibexpert değil nerden bakarsan bak yaşını hesaplayıp getiriyor.
kolay gelsin.
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 »

neden udf falan kastım bilmiyorum ya. aslında olay çok kolaymış.

Kod: Tümünü seç

YAS                     COMPUTED BY ((current_date-dogumtarihi) / 365)
hiç ıdfye gerek falan da kalmadı. çalışıyor da.
acaba ben yanlış bişey mi yaptım?
bunca usta neden udf falan kasmışlar ki bu konuda ?
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

Ben de benzer bir soruyu soruyordum: "Acaba arkadaş başka birşeyden mi bahsediyor?" diye.

Neyse doğru algılamışız en azından.

İyi çalışmalar.
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

Mesaj gönderen nitro »

gerçekten siz de aynı cevabı vermişsiniz, gözümden kaçmış demekki.
geç oldu ama yine de teşekkürü bir borç bilirim.
teşekkürler sayın @Hakan Can.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
iyide arkadaşlar bir yıl tam olarak 365 gün değil ki?
raporlamalarda hesaplamalarda yaşa göre rapor alındığı zaman sıkıntı çıkmasın sonra.
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 »

Hakan Can yazdı: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.

Aslında haklısınız. Bir yıl 365 gün değil. Onu da dikkate almak gerekiyor.

Ancak 14 Ekm 2006 tarihli ilk mesajımda sorunun (problemin) tam cevabını (2 ayrı yolla) vermiştim. Ama gözden kaçmış galiba.

Sonuçta bu problem için UDF gerekmiyor. Ama tabiki tercih sizin. Amaç sonuca ulaşmak.

İyi çalışmalar.
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

bu sorun biraz yas hesaplamasini ne kadar hassas yaptiginizla ilgili bir durum. eger sadece yili hesaba katarsaniz ve bu sizin isinizi goruyorsa extract yeterli olabilir ama ay , yil , gun sizin icin cok onemliyse sadece yildan yili cikartmak hatali sonuclara neden olabilir.

iki tarihi birbirinden cikarmak ve cikan farki 365 e bolmek artik yillarda hatalara neden olabilir.

asagida bazi farklari gorebilrisiniz

CURRENT_TIMESTAMP = 08.03.2007

Kod: Tümünü seç

select DOGUM_TARIHI, UDF_YAS,
EXTRACT(YEAR FROM CURRENT_TIMESTAMP) - EXTRACT(YEAR FROM DOGUM_TARIHI) AS EXTRACT_YAS  from TABLO 

Kod: Tümünü seç

DOGUMT   | UDF_YAS | EXTERACT_YAS
15.06.1949	57	58
07.07.1934	72	73
07.05.1944	62	63
03.01.1948	59	59
01.01.1950	57	57
06.02.1964	43	43
29.03.1964	42	43
31.05.1990	16	17
01.02.1995	12	12
06.07.1931	75	76
01.03.1942	65	65
07.03.1980	27	27
09.03.1986	20	21
06.07.1970	36	37
01.03.1966	41	41
17.08.2000	6	7
09.06.1930	76	77
01.10.1937	69	70
27.12.1963	43	44
20.01.1960	47	47
10.05.1958	48	49
01.01.1985	22	22
22.04.1989	17	18
09.01.1931	76	76
01.01.1961	46	46
01.01.1967	40	40
01.01.1988	19	19
01.01.1993	14	14
01.01.1994	13	13
29.04.1984	22	23
02.01.1982	25	25
06.06.1961	45	46
01.01.1960	47	47
04.09.1987	19	20
12.05.1990	16	17
28.01.1995	12	12
11.08.1996	10	11
18.07.1958	48	49
15.11.1980	26	27
04.01.1952	55	55
17.07.1957	49	50
01.02.1967	40	40
10.06.1991	15	16
04.03.1995	12	12
07.09.1998	8	9
07.03.1957	50	50
01.07.1961	45	46
03.01.1983	24	24
01.01.1937	70	70
09.12.1943	63	64
01.09.1944	62	63
01.07.1948	58	59
10.03.1948	58	59
03.09.1949	57	58
01.12.1965	41	42
13.05.1965	41	42
20.04.1991	15	16
01.05.1994	12	13
06.03.1998	9	9
21.07.1933	73	74
26.08.1933	73	74
27.02.1963	44	44
10.06.1952	54	55
04.06.1953	53	54
10.04.1980	26	27
10.04.1984	22	23
28.07.1986	20	21
05.09.1993	13	14

24.06.1964	42	43
05.01.1965	42	42
24.06.1990	16	17
25.07.1992	14	15
01.01.1975	32	32
01.01.1975	32	32
23.11.1999	7	8
19.02.2002	5	5
01.01.1974	33	33
01.01.1981	26	26
23.08.2000	6	7
20.06.2005	1	2
24.01.1956	51	51
20.10.1961	45	46
04.11.1985	21	22
28.11.1950	56	57
25.03.1955	51	52
29.01.1991	16	16
07.04.1981	25	26
11.08.1984	22	23
19.08.1949	57	58
01.01.1948	59	59
01.01.1987	20	20
05.06.1925	81	82
01.09.1954	52	53
29.12.1967	39	40
17.05.1963	43	44
16.08.1990	16	17
09.01.1991	16	16
03.07.1996	10	11
01.01.1926	81	81
27.12.2006	0	1
01.01.1978	29	29
02.10.1984	22	23
15.04.1949	57	58
10.01.1955	52	52
01.12.1979	27	28
03.09.1980	26	27
01.01.1920	87	87
12.03.1949	57	58
01.11.1951	55	56
10.12.1973	33	34
15.08.1980	26	27
07.05.1991	15	16
20.02.1939	68	68
21.03.1943	63	64
12.11.1986	20	21
13.06.1946	60	61
28.12.1983	23	24
01.01.1987	20	20
01.01.1979	28	28
01.01.1983	24	24
19.01.2004	3	3
20.03.1954	52	53
01.10.1955	51	52
26.11.1979	27	28
03.06.1983	23	24
03.01.1933	74	74
03.07.1935	71	72
10.01.1981	26	26
21.07.1982	24	25
01.09.2000	6	7
06.04.2006	0	1
09.11.1948	58	59
15.08.1950	56	57
03.06.1983	23	24
04.09.1939	67	68
01.07.1977	29	30
20.03.1978	28	29
04.12.2001	5	6
04.09.2003	3	4
20.04.1945	61	62
03.06.1980	26	27
01.01.1964	43	43
05.01.1964	43	43
13.09.1989	17	18
13.09.1989	17	18
05.06.1998	8	9
27.08.2001	5	6
08.06.1960	46	47
13.08.1962	44	45
15.09.1986	20	21
09.10.1992	14	15
20.05.2005	1	2
02.03.1955	52	52
01.01.1988	19	19
01.01.1982	25	25
01.01.1920	87	87
01.01.1967	40	40
15.11.1988	18	19
02.06.1990	16	17
01.01.1990	17	17
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

Kod: Tümünü seç

SELECT
  DOGUM_TARIHI,
  UDF_YAS,
  CASE WHEN EXTRACT(MONTH FROM CURRENT_TIMESTAMP) * 12 + EXTRACT(DAY FROM CURRENT_TIMESTAMP) < EXTRACT(MONTH FROM DOGUM_TARIHI) * 12 + EXTRACT(DAY FROM DOGUM_TARIHI) THEN
            EXTRACT(YEAR FROM CURRENT_TIMESTAMP) - EXTRACT(YEAR FROM DOGUM_TARIHI) - 1
       ELSE
            EXTRACT(YEAR FROM CURRENT_TIMESTAMP) - EXTRACT(YEAR FROM DOGUM_TARIHI) END AS EXTRACT_YAS
FROM TABLO
Aynı sonucu verecektir.

İyi çalışmalar.
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

Hakan Can yazdı: Aynı sonucu verecektir.
bir yerde ufak bir hata daha var :) (veya eksik :idea: )

Kod: Tümünü seç

DOGUMT   | UDF_YAS | EXTERACT_YAS 
26.02.2005	2	1
23.02.2005	2	1
28.02.2002	5	4
22.02.2002	5	4
25.02.1984	23	22
27.02.1938	69	68
En son sadettinpolat tarafından 09 Mar 2007 12:53 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

Kod: Tümünü seç

SELECT 
  DOGUM_TARIHI, 
  UDF_YAS, 
  CASE WHEN EXTRACT(MONTH FROM CURRENT_TIMESTAMP) * 120 + EXTRACT(DAY FROM CURRENT_TIMESTAMP) < EXTRACT(MONTH FROM DOGUM_TARIHI) * 120 + EXTRACT(DAY FROM DOGUM_TARIHI) THEN 
            EXTRACT(YEAR FROM CURRENT_TIMESTAMP) - EXTRACT(YEAR FROM DOGUM_TARIHI) - 1 
       ELSE 
            EXTRACT(YEAR FROM CURRENT_TIMESTAMP) - EXTRACT(YEAR FROM DOGUM_TARIHI) END AS EXTRACT_YAS 
FROM TABLO
12'yi 120 yaparsınız artık hiç ihtimal kalmaz. Zira normalde 12 değil 31 olması gerekiyordu. Gerçi ben genelde 100 veya 1000 yazarım ne olur ne olmaz diye. Ama ne olduğu anlaşılsın diye 12 yazmıştım.

İyi çalışmalar.
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

bunda bi sorunla karsilasmadim :D
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Cevapla