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