Discussion:
iän laskeminen sotusta SQL:llä (Oracle)
(too old to reply)
Seppo Pakanen
2005-09-06 09:47:44 UTC
Permalink
Onko olemassa sellaista funktiota (tai itse tehtyä kaavaa) SQL:ssa
(Oracle), jolla voidaan laskea ikä sotu-tunnuksesta tiettynä
tarkastelupäivänä? Esimerkiksi mikä on henkilön ikä tarkastelupäivänä
06.08.2005, jonka sotun alkuosa on muotoa 230480? Oraclessa henkilön ikä
on muotoa vvkkpp eli esimerkkitapauksessa 800423.
Juha Nevamäki
2005-09-06 11:18:35 UTC
Permalink
Post by Seppo Pakanen
Onko olemassa sellaista funktiota (tai itse tehtyä kaavaa) SQL:ssa
(Oracle), jolla voidaan laskea ikä sotu-tunnuksesta tiettynä
tarkastelupäivänä? Esimerkiksi mikä on henkilön ikä tarkastelupäivänä
06.08.2005, jonka sotun alkuosa on muotoa 230480? Oraclessa henkilön
ikä on muotoa vvkkpp eli esimerkkitapauksessa 800423.
Tämä näyttäisi toimivan:

select round((sysdate - to_date(substr(col_sotu,1,6),'DD.MM.RRRR')) / 365.25,2) AGE from table

Juha
Seppo Pakanen
2005-09-06 11:28:29 UTC
Permalink
Kiitos! Kaava toimi.

T. Seppo
Post by Juha Nevamäki
Post by Seppo Pakanen
Onko olemassa sellaista funktiota (tai itse tehtyä kaavaa) SQL:ssa
(Oracle), jolla voidaan laskea ikä sotu-tunnuksesta tiettynä
tarkastelupäivänä? Esimerkiksi mikä on henkilön ikä tarkastelupäivänä
06.08.2005, jonka sotun alkuosa on muotoa 230480? Oraclessa henkilön
ikä on muotoa vvkkpp eli esimerkkitapauksessa 800423.
select round((sysdate - to_date(substr(col_sotu,1,6),'DD.MM.RRRR')) / 365.25,2) AGE from table
Juha
Matti Rintala
2005-09-06 11:57:36 UTC
Permalink
Post by Juha Nevamäki
Post by Seppo Pakanen
Onko olemassa sellaista funktiota (tai itse tehtyä kaavaa) SQL:ssa
(Oracle), jolla voidaan laskea ikä sotu-tunnuksesta tiettynä
tarkastelupäivänä?
select round((sysdate - to_date(substr(col_sotu,1,6),'DD.MM.RRRR')) / 365.25,2) AGE from table
Se ei taida ottaa huomioon sitä, että sotun (nykyisin hetu) vuosien
jälkeinen erikoismerkki ilmoittaa vuosisadan:

'-' : 19xx
'+' : 18xx
'A' : 20xx

http://www.vaestorekisterikeskus.fi/vrk/home.nsf/0/32C708B9CA6C5824C2256CB70038D048?Opendocument
--
------------- Matti Rintala ------------ ***@tut.fi ------------
Painting is the art of inclusion. Photography is an art of exclusion.
Juha Nevamäki
2005-09-06 13:17:15 UTC
Permalink
Post by Matti Rintala
Post by Juha Nevamäki
Post by Seppo Pakanen
Onko olemassa sellaista funktiota (tai itse tehtyä kaavaa) SQL:ssa
(Oracle), jolla voidaan laskea ikä sotu-tunnuksesta tiettynä
tarkastelupäivänä?
select round((sysdate - to_date(substr(col_sotu,1,6),'DD.MM.RRRR'))
/ 365.25,2) AGE from table
Se ei taida ottaa huomioon sitä, että sotun (nykyisin hetu) vuosien
'-' : 19xx
'+' : 18xx
'A' : 20xx
http://www.vaestorekisterikeskus.fi/vrk/home.nsf/0/32C708B9CA6C5824C2256CB70038D048?Opendocument
Totta. Tuo oli quick and dirty ratkaisu. Mutta tässä on decode lisättynä:

select round((sysdate - to_date(substr(col_sotu,1,4) ||
decode(substr(col_sotu,7,1),'+','18','-','19','A','20') ||
substr(col_sotu,5,2),'DD.MM.YYYY')) / 365.25,2) AGE from table

Juha

Paul Keinanen
2005-09-06 13:12:09 UTC
Permalink
On Tue, 06 Sep 2005 12:47:44 +0300, Seppo Pakanen
Post by Seppo Pakanen
Onko olemassa sellaista funktiota (tai itse tehtyä kaavaa) SQL:ssa
(Oracle), jolla voidaan laskea ikä sotu-tunnuksesta tiettynä
tarkastelupäivänä? Esimerkiksi mikä on henkilön ikä tarkastelupäivänä
06.08.2005, jonka sotun alkuosa on muotoa 230480? Oraclessa henkilön ikä
on muotoa vvkkpp eli esimerkkitapauksessa 800423.
Tuossa on yksi paha periaatteellinen ongelma käyttää hetusta vain
kuusi ensimmäistä merkkiä, sillä tuosta seuraa pahoja
duplikaattiongelmia. Hetun erotinmerkkikin on syytä ottaa
tarkasteluun.

Miten muuten erotat 241299+nnnx (24.12.1899) ja 241299-nnnx
(24.12.1999) syntyneet toisistaan ? Entäpä 010502-nnnx (1.5.1902) ja
010502Annnx (1.5.2002) toisistaan ?

Tästähän on klassisia esimerkkejä, kun 107 vuotias on saanut
kehotuksen mennä peruskoulun ensimmäiselle luokalle :-).

Paul
Loading...