it-swarm.com.de

Berechnen Sie die Differenz zwischen zwei Datumsangaben in Oracle SQL

Ich habe einen Tisch 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 die Differenz in Stunden, Minuten und Sekunden (und möglicherweise Tagen) zwischen den beiden Daten in Oracle SQL berechnen?

Vielen Dank

71
Steve

Sie können Datumsangaben in Oracle abziehen. Dies gibt Ihnen den Unterschied in Tagen. Multipliziere 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 Datumsangaben, die durch den Oracle-Datentyp DATE..__ dargestellt werden. 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 Funktion EXTRACT.

102
Thilo

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 ][1]

13
Nikolay Frick
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.

13
Mohsen Heydari
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.

12
Ishan Rastogi

Sie können die to_timestamp-Funktion verwenden, um die Datumsangaben in Zeitstempel zu konvertieren und eine Subtraktion durchzuführen.

So 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
5
HyLian

Berechnen Sie das Alter von HIREDATE bis zum Systemdatum Ihres 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;
4
SUNIL BEHERA

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;

Die Uhrzeit wird in besser lesbarer Form angezeigt, z.

4
RLapinski
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 );
3
amitt Gaur
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 
1
user3496353
(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 
1
user1012506

Wenn Sie etwas suchen, das etwas einfacher aussieht, 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 arbeiten, bis Sie den gewünschten Minutenwert erhalten. Der Wert .0007 ist zufällig 1 Minute, soweit die sysdate-signifikanten Stellen betroffen sind. Sie können ein Vielfaches davon verwenden, um einen anderen gewünschten 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;
1
Cliff Adams

Dies zählt die Zeit zwischen den Datumsangaben:

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
gpio

Wenn Sie zwei Datumsangaben aus 'your_table' auswählen und das Ergebnis auch als einzeilige Ausgabe sehen möchten (z. B. ' days - hh: mm: ss '), können Sie so etwas verwenden this . Zuerst können Sie das Intervall zwischen diesen beiden Daten berechnen und anschließend alle Daten exportieren, die Sie aus diesem Intervall benötigen:

         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 Ihnen folgendes Ergebnis geben: 0 Tage - 1:14:55

0
Nik

Wenn Sie ein Datum erhalten möchten, weichen Sie von der Verwendung von Tabelle und Spalte ab.

SELECT TO_DATE( TO_CHAR(COLUMN_NAME_1, 'YYYY-MM-DD'), 'YYYY-MM-DD') - 
       TO_DATE(TO_CHAR(COLUMN_NAME_2, 'YYYY-MM-DD') , 'YYYY-MM-DD')  AS DATEDIFF       
FROM TABLE_NAME;
0
Nurullah

in Oracle 11g 

select end_date - start_date als day_diff aus tablexxx Angenommen, das starT_date end_date ist in der Tabellexxx definiert

0
Michael
$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'"; 
0
sujan chowdhury

Hier ist eine weitere 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;
0
user2077098