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.
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
> 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.
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.