2009-07-08 13 views
63

Ich habe eine Tabelle wie folgt:berechnen Differenz zwischen 2 Datum/Zeit in Oracle SQL

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 Tage) zwischen den beiden Daten in Oracle SQL calcuate ?

Dank

+0

zu überprüfen Near-Duplicate: http://StackOverflow.com/questions/9322935/subtracting-dates-in-Oracle-Number-Or-Interval-Datatype –

Antwort

93

Sie können Daten in Oracle substract. 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 auf Daten gilt DATE durch den Oracle-Datentyp dargestellt. Oracle hat auch einen Datentyp TIMESTAMP, der auch ein Datum (mit Uhrzeit) darstellen kann. Wenn Sie TIMESTAMP Werte subtrahieren, erhalten Sie eine INTERVAL; Um numerische Werte zu extrahieren, verwenden Sie die EXTRACT Funktion.

+2

Hat sich das Verhalten von Oracle irgendwann verändert? Wenn ich ein Datum von einem anderen subtrahiere, bekomme ich einen 'INTERVAL'-Datentyp, kein einfaches Float. –

+1

@JonofAllTrades: Nein, wenn Sie Werte vom Typ 'DATUM' subtrahieren, erhalten Sie die Anzahl der Tage (als 'ANZAHL'). Wenn Sie jedoch 'TIMESTAMP'-Werte subtrahieren, erhalten Sie' INTERVALDS'. Wahrscheinlich arbeiten Sie mit 'TIMESTAMP'- und nicht mit' DATE'-Werten. Ich habe die Antwort bearbeitet. – sleske

+0

In Bezug auf Ihre Notiz - Beide Datentypen "DATE" und "TIMESTAMP" haben eine Zeitkomponente (Stunden, Minuten und Sekunden). 'TIMESTAMP' hat auch eine Sekundenkomponente in Sekundenbruchteilen (und möglicherweise Zeitzonenkomponenten). – MT0

5

Mit der Funktion to_timestamp können Sie die Daten in Zeitstempel konvertieren und eine Subtraktion durchfü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 
+6

welche Einheiten würde das geben? Std? Millisekunden? Splitter? – skaffman

+0

Ich habe versucht, beide to_date und to_timestamp und beide geben mir eine Antwort in Tagen, abgerundet, wenn der Unterschied 1 Stunde ist, bekomme ich eine Antwort von 0, multipliziert mit 24 ergibt 0. Ich bekomme die richtige Antwort, wenn ich tippe in der Datumszeit, aber ich kann das nicht für 25m Reihen tun. Irgendwelche Gedanken? – Steve

+3

Durch die Subtraktion zwischen den Zeitstempeln erhalten Sie einen weiteren Zeitstempel in einem Format wie "DAYS HOUR: MINS: SECS.milisecs". Sie können dies abschneiden, um den benötigten Wert zu erhalten – HyLian

0
$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'"; 
4

berechnen Alter von HIREDATE zu Systemdatum des 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; 
13
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 ; 

Hoffnung, das hilft.

0

Dies wird Zeit zwischen zu Terminen 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 
0

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; 
2
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); 
0
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 
9
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] 
    ); 

Dies gibt Ihnen drei Spalten als Tage, Stunden und Protokoll.

3

Sie können auch versuchen, diese:

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 ist Zeit, in mehr Menschen lesbaren Form zeigt, wie: 00.01.34. Wenn Sie auch Tage brauchen, können Sie einfach DD zum letzten Formatierungsstring hinzufügen.

0

in Oracle 11g

wählen end_date - start_date als day_diff von tablexxx nehme an, die start_date end_date im tablexxx zu definieren ist

1

Wenn Sie etwas suchen, das etwas einfacher aussieht, versuchen Sie dies, um Ereignisse zu finden n eine Tabelle, die in der letzten 1 Minute aufgetreten ist:

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

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

Ergebnis ist 1 (Minute)

Dann ist es eine einfache Sache für

select * from my_table where (sysdate - transdate) < .00071; 
+0

.0007 ist fest codiert, bitte korrigieren – user1012506

0
(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 
Verwandte Themen