Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

operazioni su data con Oracle

2,268 views
Skip to first unread message

[hawk]

unread,
Jun 3, 2003, 12:23:40 PM6/3/03
to
Ciao,
devo tirar fuori da gli anni passati dalla data di nascita di una persona
e la data corrente, insomma l'età della persona.
Come posso farlo con l'SQL?


Andrea Salzano

unread,
Jun 4, 2003, 9:32:32 AM6/4/03
to

Dunque, la differenza fra due date e' un numero razionale positivo.
La parte intera rappresenta i giorni trascorsi fra le due date.

Esempio:
SQL> create table a (data_nascita date);

Table created.


SQL> insert into a values (to_date('07/01/1971','dd/mm/yyyy'));

1 row created.

SQL> commit;

Commit complete.

SQL> select sysdate-data_nascita from a;

SYSDATE-DATA_NASCITA
--------------------
11836.6257

Il problema puo' sorgere, considerando il fatto che la data e'
memorizzata anche con le ore, i minuti ed i secondi.
Per evitare complicazioni si puo' usare la funzione TRUNC che
"tronca" l'ora a mezzanotte. In tal caso le due date avrebbero
lo stesso punto di riferimento: le 00:00:00 appunto.


SQL> select trunc(sysdate)-trunc(data_nascita) from a;

TRUNC(SYSDATE)-TRUNC(DATA_NASCITA)
----------------------------------
11836

A questo punto abbiamo i giorni tra oggi e la mia data di nascita.
Se dividiamo x 365, otteniamo gli anni:

QL> select (trunc(sysdate)-trunc(data_nascita))/365 from a;

(TRUNC(SYSDATE)-TRUNC(DATA_NASCITA))/365
----------------------------------------
32.4273973

...in formato decimale. Possiamo allora usare le funzioni CEIL
o FLOOR x decidere se approssimare all'intero piu' alto o
a quello piu' basso, rispettivamente.

SQL> select ceil((trunc(sysdate)-trunc(data_nascita))/365) from a

CEIL((TRUNC(SYSDATE)-TRUNC(DATA_NASCITA))/365)
----------------------------------------------
33

SQL> select floor((trunc(sysdate)-trunc(data_nascita))/365) from a

FLOOR((TRUNC(SYSDATE)-TRUNC(DATA_NASCITA))/365)
-----------------------------------------------
32


Spero OK.

felice_pago

unread,
Jun 4, 2003, 10:18:01 AM6/4/03
to
Il 04 Giu 2003, 15:32, "Andrea Salzano" <andrea....@inwind.it> ha
scritto:

Si !

select
round(months_between(sysdate,to_date('07-gen-1971','dd-mon-yyyy'))/12) from
dual;


felice_pago

--------------------------------
Inviato via http://usenet.libero.it

Andrea Salzano

unread,
Jun 4, 2003, 11:10:42 AM6/4/03
to
On Wed, 04 Jun 2003 14:18:01 +0000, felice_pago wrote:

> select
> round(months_between(sysdate,to_date('07-gen-1971','dd-mon-yyyy'))/12) from
> dual;

Ottimo.
Con MONTHS_BETWEEN non si ha neanche la necessita' di preoccuparsi
del problema dell'orario sulla data e quindi utilizzare la TRUNC.

[hawk]

unread,
Jun 4, 2003, 12:22:44 PM6/4/03
to
"Andrea Salzano" <andrea....@inwind.it> ha scritto nel messaggio
news:pan.2003.06.04....@inwind.it...

grazie delle risposte.
Nel frattempo che aspettavo, dopo aver fatto alcune ricerche
ero arrivato a questo risultato

select (trunc(months_between(trunc(data_fine),trunc(data_inizio))) / 12)
from tabella

ma avevo sempre come risultato un numero con la virgola e in ogni caso
non ero sicuro che quello fosse il modo piu' corretto per estrarre
l'eta' di una persona.
Grazie di nuovo.


0 new messages