Crea sito

Differenza tra due date in Oracle

Supponiamo di avere una tabella su Oracle (l’esempio che sto trattando qui fa riferimento ad Oracle Database 12c) che presenta dei campi di tipo “date” e desiderate estrarre i dati da queste colonne facendone la differenza. Prima di partire con la classica select è bene verificare in che formato sono visualizzate le date nel nostro database.

set linesize 300
select * from nls_session_parameters where parameter in ('NLS_DATE_FORMAT','NLS_DATE_LANGUAGE');

PARAMETER VALUE
------------------------------ ----------------------------------------------------------------
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE AMERICAN

Se non è possibile modificare i parametri di configurazione relativi alla lingua di sistema e al formato delle date allora possiamo alterare solo la sessione relativa alla nostra query con il seguente comando:

alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

Verifichiamo che ora il formato sia corretto con la select predente e quindi possiamo andare a fare la differenza tra i due campi data:

set linesize 120
column PROGRESSIVO format 999999
column "EXPORT DIFF (sec)" format 999999
column Export_Diff format a22
column EXPORT_START_DATE format a22
column EXPORT_END_DATE format a22
select PROGRESSIVO,EXPORT_START_DATE,EXPORT_END_DATE,
to_timestamp(EXPORT_END_DATE, 'YYYY-MM-DD hh24:mi:ss') - to_timestamp(EXPORT_START_DATE, 'YYYY-MM-DD hh24:mi:ss') as Export_Diff,
round((EXPORT_END_DATE - EXPORT_START_DATE) * 86400) as "EXPORT DIFF (sec)"
from tabella_export_log;

Questo è l’output che ottengo in sqlplus in cui sono presenti le due colonne con la differenza tra le due date; una presenta la differenza come tipo “date” e l’altra come numero totale di secondi:


PROGRESSIVO EXPORT_START_DATE               EXPORT_END_DATE        EXPORT_DIFF            EXPORT DIFF (sec)
----------- ------------------------------ ---------------------- ---------------------- -----------------
      13010 2010-05-26 12:22:38            2010-05-26 12:30:05    +000000000 00:07:27                  447
      13009 2010-05-26 11:22:36            2010-05-26 11:30:00    +000000000 00:07:24                  444
      12605 2010-05-25 11:23:27            2010-05-25 11:40:53    +000000000 00:17:26                 1046
      12001 2010-05-25 02:00:33            2010-05-25 02:06:33    +000000000 00:06:00                  360
      10608 2010-05-24 15:49:41            2010-05-24 16:02:58    +000000000 00:13:17                  797
       9001 2010-05-23 21:26:59            2010-05-23 21:39:58    +000000000 00:12:59                  779

Leave a Reply

Il tuo indirizzo email non sarà pubblicato.

*