Calcola la differenza tra 2 date / ore in Oracle SQL

Ho una tabella come segue:

Filename - varchar Creation Date - Date format dd/mm/yyyy hh24:mi:ss Oldest cdr date - Date format dd/mm/yyyy hh24:mi:ss 

Come posso calcolare la differenza in ore, minuti e secondi (e possibilmente giorni) tra le due date in Oracle SQL?

Grazie

È ansible sottrarre date in Oracle. Questo ti darà la differenza in giorni. Moltiplicare per 24 per ottenere ore e così via.

 SQL> select oldest - creation from my_table; 

Se la tua data è memorizzata come dati carattere, devi prima convertirla in un tipo di data.

 SQL> select 24 * (to_date('2009-07-07 22:00', 'YYYY-MM-DD hh24:mi') - to_date('2009-07-07 19:30', 'YYYY-MM-DD hh24:mi')) diff_hours from dual; DIFF_HOURS ---------- 2.5 

Nota :

Questa risposta si applica alle date rappresentate dal tipo di dati Oracle DATE . Oracle ha anche un tipo di dati TIMESTAMP , che può anche rappresentare una data (con orario). Se si sottrae i valori TIMESTAMP , si ottiene un INTERVAL ; per estrarre valori numerici, utilizzare la funzione EXTRACT .

 declare strTime1 varchar2(50) := '02/08/2013 01:09:42 PM'; strTime2 varchar2(50) := '02/08/2013 11:09:00 PM'; v_date1 date := to_date(strTime1,'DD/MM/YYYY HH:MI:SS PM'); v_date2 date := to_date(strTime2,'DD/MM/YYYY HH:MI:SS PM'); difrence_In_Hours number; difrence_In_minutes number; difrence_In_seconds number; begin difrence_In_Hours := (v_date2 - v_date1) * 24; difrence_In_minutes := difrence_In_Hours * 60; difrence_In_seconds := difrence_In_minutes * 60; dbms_output.put_line(strTime1); dbms_output.put_line(strTime2); dbms_output.put_line('*******'); dbms_output.put_line('difrence_In_Hours : ' || difrence_In_Hours); dbms_output.put_line('difrence_In_minutes: ' || difrence_In_minutes); dbms_output.put_line('difrence_In_seconds: ' || difrence_In_seconds); end ; 

Spero che questo ti aiuti.

 select extract( day from diff ) Days, extract( hour from diff ) Hours, extract( minute from diff ) Minutes from ( select (CAST(creationdate as timestamp) - CAST(oldcreationdate as timestamp)) diff from [TableName] ); 

Questo ti darà tre colonne come Giorni, Ore e Minuti.

Per ottenere risultati in secondi:

 select (END_DT - START_DT)*60*60*24 from MY_TABLE; 

Controlla [ https://community.oracle.com/thread/2145099?tstart=0%5D%5B1%5D

È ansible utilizzare la funzione to_timestamp per convertire le date in timestamp ed eseguire un’operazione di sottrazione.

Qualcosa di simile a:

 SELECT TO_TIMESTAMP ('13.10.1990 00:00:00','DD.MM.YYYY HH24:MI:SS') - TO_TIMESTAMP ('01.01.1990:00:10:00','DD.MM.YYYY:HH24:MI:SS') FROM DUAL 

Calcola l’età da HIREDATE alla data di sistema del tuo computer

 SELECT HIREDATE||' '||SYSDATE||' ' || TRUNC(MONTHS_BETWEEN(SYSDATE,HIREDATE)/12) ||' YEARS '|| TRUNC((MONTHS_BETWEEN(SYSDATE,HIREDATE))-(TRUNC(MONTHS_BETWEEN(SYSDATE,HIREDATE)/12)*12))|| 'MONTHS' AS "AGE " FROM EMP; 

Puoi anche provare questo:

 select to_char(to_date('1970-01-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss')+(end_date - start_date),'hh24:mi:ss') as run_time from some_table; 

Visualizza il tempo in forma più leggibile, come: 00:01:34. Se hai bisogno anche di giorni potresti semplicemente aggiungere DD all’ultima stringa di formattazione.

 select days||' '|| time from ( SELECT to_number( to_char(to_date('1','J') + (CLOSED_DATE - CREATED_DATE), 'J') - 1) days, to_char(to_date('00:00:00','HH24:MI:SS') + (CLOSED_DATE - CREATED_DATE), 'HH24:MI:SS') time FROM request where REQUEST_ID=158761088 ); 
 select (floor(((DATE2-DATE1)*24*60*60)/3600)|| ' : ' ||floor((((DATE2-DATE1)*24*60*60) -floor(((DATE2-DATE1)*24*60*60)/3600)*3600)/60)|| ' ' ) as time_difference from TABLE1 

Se vuoi qualcosa che sembri un po ‘più semplice, prova questo per trovare gli eventi in una tabella avvenuta nell’ultimo minuto:

Con questa voce puoi armeggiare con i valori decimali fino ad ottenere il valore minuto che desideri. Il valore .0007 è di 1 minuto per quanto riguarda le cifre significative di sysdate. Puoi utilizzare multipli di quello per ottenere qualsiasi altro valore che desideri:

 select (sysdate - (sysdate - .0007)) * 1440 from dual; 

Il risultato è 1 (minuto)

Quindi è una questione semplice da verificare

 select * from my_table where (sysdate - transdate) < .00071; 
 (TO_DATE(:P_comapre_date_1, 'dd-mm-yyyy hh24:mi') - TO_DATE(:P_comapre_date_2, 'dd-mm-yyyy hh24:mi'))*60*60*24 sum_seconds, (TO_DATE(:P_comapre_date_1, 'dd-mm-yyyy hh24:mi') - TO_DATE(:P_comapre_date_2, 'dd-mm-yyyy hh24:mi'))*60*24 sum_minutes, (TO_DATE(:P_comapre_date_1, 'dd-mm-yyyy hh24:mi') - TO_DATE(:P_comapre_date_2, 'dd-mm-yyyy hh24:mi'))*24 sum_hours, (TO_DATE(:P_comapre_date_1, 'dd-mm-yyyy hh24:mi') - TO_DATE(:P_comapre_date_2, 'dd-mm-yyyy hh24:mi')) sum_days 
 $sql="select bsp_bp,user_name,status, to_char(ins_date,'dd/mm/yyyy hh12:mi:ss AM'), to_char(pickup_date,'dd/mm/yyyy hh12:mi:ss AM'), trunc((pickup_date-ins_date)*24*60*60,2),message,status_message from valid_bsp_req where id >= '$id'"; 

Questo conterà il tempo tra le date:

 SELECT (TO_CHAR( TRUNC (ROUND(((sysdate+1) - sysdate)*24,2))*60,'999999') + TO_CHAR(((((sysdate+1)-sysdate)*24)- TRUNC(ROUND(((sysdate+1) - sysdate)*24,2)))/100*60 *100, '09'))/60 FROM dual 

Ecco un’altra opzione:

 with tbl_demo AS (SELECT TO_DATE('11/26/2013 13:18:50', 'MM/DD/YYYY HH24:MI:SS') dt1 , TO_DATE('11/28/2013 21:59:12', 'MM/DD/YYYY HH24:MI:SS') dt2 FROM dual) SELECT dt1 , dt2 , round(dt2 - dt1,2) diff_days , round(dt2 - dt1,2)*24 diff_hrs , numtodsinterval((dt2 - dt1),'day') diff_dd_hh_mm_ss from tbl_demo; 

in oracle 11g

selezionare end_date – start_date come day_diff da tablexxx supponiamo che starT_date end_date sia definito nella tabellaxxx

Se selezioni due date da ‘ your_table ‘ e vuoi vedere anche il risultato come output di una singola colonna (es. ‘ Days – hh: mm: ss ‘) potresti usare qualcosa di simile. Innanzitutto è ansible calcolare l’intervallo tra queste due date e successivamente esportare tutti i dati necessari da tale intervallo:

  select extract (day from numtodsinterval (second_date - add_months (created_date, floor (months_between (second_date,created_date))), 'day')) || ' days - ' || extract (hour from numtodsinterval (second_date - add_months (created_date, floor (months_between (second_date,created_date))), 'day')) || ':' || extract (minute from numtodsinterval (second_date - add_months (created_date, floor (months_between (second_date, created_date))), 'day')) || ':' || extract (second from numtodsinterval (second_date - add_months (created_date, floor (months_between (second_date, created_date))), 'day')) from your_table 

E questo dovrebbe darti un risultato come questo: 0 giorni – 1:14:55