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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.