Berechnen Sie die Differenz zwischen 2 Datum / Uhrzeit in Oracle SQL

Ich habe eine Tabelle wie folgt:

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

Wie kann ich den Unterschied in Stunden Minuten und Sekunden (und möglicherweise Tagen) zwischen den beiden Daten in Oracle SQL berechnen?

Vielen Dank

Sie können Daten in Oracle subtrahieren. Dies wird Ihnen den Unterschied in Tagen geben. Multiplizieren Sie mit 24, um Stunden zu erhalten und so weiter.

 SQL> select oldest - creation from my_table; 

Wenn Ihr Datum als Zeichendaten gespeichert ist, müssen Sie es zuerst in einen Datumstyp konvertieren.

 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 

Hinweis :

Diese Antwort gilt für Daten, die durch den Oracle-Datentyp DATE . Oracle hat auch einen Datentyp TIMESTAMP , der auch ein Datum (mit Zeitangabe) darstellen kann. Wenn Sie TIMESTAMP Werte subtrahieren, erhalten Sie ein INTERVAL ; Um numerische Werte zu extrahieren, verwenden Sie die EXTRACT function.

 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 ; 

Hoffe das hilft.

 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] ); 

Dadurch erhalten Sie drei Spalten als Tage, Stunden und Minuten.

Um das Ergebnis in Sekunden zu erhalten:

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

Überprüfen Sie [ https://community.oracle.com/thread/2145099?tstart=0%5D%5B1%5D

Sie können die function to_timestamp verwenden, um die Daten in Zeitstempel zu konvertieren und eine Subtraktionsoperation auszuführen.

Etwas wie:

 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 

Berechne das Alter von HIREDATE zum Systemdatum deines Computers

 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; 

Sie können dies auch versuchen:

 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; 

Es zeigt Zeit in einer besser lesbaren Form an, wie: 00:01:34. Wenn Sie auch Tage benötigen, können Sie einfach DD zur letzten Formatierungszeichenfolge hinzufügen.

 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 

Wenn Sie etwas einfacher aussehen möchten, versuchen Sie dies, um Ereignisse in einer Tabelle zu finden, die in der letzten 1 Minute aufgetreten sind:

Mit diesem Eintrag können Sie mit den Dezimalwerten experimentieren, bis Sie den gewünschten Minutenwert erhalten. Der Wert .0007 ist 1 Minute lang, was die signifikanten Ziffern des SYSDAT betrifft. Sie können ein Vielfaches davon verwenden, um einen beliebigen anderen Wert zu erhalten:

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

Ergebnis ist 1 (Minute)

Dann ist es eine einfache Sache zu überprüfen

 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'"; 

Dies wird die Zeit zwischen den Daten zählen:

 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 

Hier ist eine andere Option:

 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

Wählen Sie end_date – start_date als day_diff aus tablexxx Nehmen wir an, das Enddatum von stateT_date ist in der Tabellexxx definiert

Wenn Sie zwei Daten aus ‘ your_table ‘ auswählen und das Ergebnis auch als einzelne Spaltenausgabe sehen möchten (zB ‘ Tage – hh: mm: ss ‘), könnten Sie etwas ähnliches verwenden. Zuerst können Sie das Intervall zwischen diesen beiden Daten berechnen und anschließend alle Daten aus diesem Intervall exportieren:

  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 

Und das sollte dir folgendes Ergebnis geben: 0 Tage – 1:14:55