Mam następującą tabelę:
Filename - varchar
Creation Date - Date format dd/mm/yyyy hh24:mi:ss
Oldest cdr date - Date format dd/mm/yyyy hh24:mi:ss
Jak obliczyć różnicę w godzinach, minutach i sekundach (i prawdopodobnie dniach) między dwiema datami w Oracle SQL?
Dzięki
oracle
date-arithmetic
Steve
źródło
źródło
Odpowiedzi:
W Oracle możesz odejmować daty. To da ci różnicę w dniach. Pomnóż przez 24, aby uzyskać godziny i tak dalej.
SQL> select oldest - creation from my_table;
Jeśli twoja data jest przechowywana jako dane znakowe, musisz najpierw przekonwertować ją na typ daty.
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
Uwaga :
Ta odpowiedź dotyczy dat reprezentowanych przez typ danych Oracle
DATE
. Oracle ma również typ danychTIMESTAMP
, który może również reprezentować datę (z czasem). Jeśli odejmieszTIMESTAMP
wartości, otrzymaszINTERVAL
; aby wyodrębnić wartości liczbowe, użyjEXTRACT
funkcji.źródło
INTERVAL
typ danych, a nie zwykłą liczbę zmiennoprzecinkową.DATE
, otrzymasz liczbę dni (jakoNUMBER
). Jeśli jednak odejmieszTIMESTAMP
wartości, otrzymaszINTERVALDS
. Prawdopodobnie pracujesz z wartościami,TIMESTAMP
a nieDATE
. Poprawiłem odpowiedź.DATE
iTIMESTAMP
mają składnik czasu (godziny, minuty i sekundy).TIMESTAMP
ma również składnik czasu w ułamkach sekund (i potencjalnie składniki strefy czasowej).Aby uzyskać wynik w kilka sekund:
select (END_DT - START_DT)*60*60*24 from MY_TABLE;
Sprawdź [ https://community.oracle.com/thread/2145099?tstart=0][1]
źródło
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 ;
Mam nadzieję że to pomoże.
źródło
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] );
To da ci trzy kolumny jako dni, godziny i minuty.
źródło
Możesz także spróbować tego:
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;
Wyświetla czas w bardziej czytelnej dla człowieka formie, na przykład: 00:01:34. Jeśli potrzebujesz również dni, możesz po prostu dodać DD do ostatniego ciągu formatującego.
źródło
Możesz użyć funkcji to_timestamp, aby przekonwertować daty na znaczniki czasu i wykonać operację odejmowania.
Coś jak:
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
źródło
Oblicz wiek od HIREDATE do daty systemowej komputera
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;
źródło
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 );
źródło
W wyroczni 11g
SELECT end_date - start_date AS day_diff FROM tablexxx suppose the starT_date end_date is define in the tablexxx
źródło
Jeśli wybierzesz dwie daty z „ twoja_tabela ” i chcesz również zobaczyć wynik w postaci pojedynczej kolumny (np. „ Dni - gg: mm: ss ”), możesz użyć czegoś takiego. Najpierw możesz obliczyć odstęp między tymi dwiema datami, a następnie wyeksportować wszystkie potrzebne dane z tego przedziału:
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
A to powinno dać taki wynik: 0 dni - 1:14:55
źródło
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
źródło
Jeśli chcesz czegoś, co wygląda na nieco prostsze, spróbuj tego, aby znaleźć zdarzenia w tabeli, które miały miejsce w ciągu ostatniej minuty:
Dzięki temu wpisowi możesz bawić się wartościami dziesiętnymi, aż uzyskasz żądaną wartość minutową. Wartość .0007 wynosi 1 minutę, jeśli chodzi o cyfry znaczące w sysdate. Możesz użyć wielokrotności tego, aby uzyskać dowolną inną wartość:
select (sysdate - (sysdate - .0007)) * 1440 from dual;
Wynik to 1 (minuta)
Wtedy łatwo jest sprawdzić
select * from my_table where (sysdate - transdate) < .00071;
źródło
źródło
select to_char(actual_start_date,'DD-MON-YYYY hh24:mi:ss') start_time, to_char(actual_completion_date,'DD-MON-YYYY hh24:mi:ss') end_time, floor((actual_completion_date-actual_start_date)*24*60)||'.'||round(mod((actual_completion_date-actual_start_date)*24*60*60,60)) diff_time from fnd_concurrent_requests order by request_id desc;
źródło
$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'";
źródło
Będzie to liczyć czas między datami:
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
źródło
Oto inna opcja:
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;
źródło
Pojedyncze zapytanie, które zwróci różnicę czasu dwóch kolumn datownika:
select INS_TS, MAIL_SENT_TS, extract( hour from (INS_TS - MAIL_SENT_TS) ) timeDiff from MAIL_NOTIFICATIONS;
źródło
Jeśli chcesz, aby data odroczona była przy użyciu tabeli i kolumny.
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;
źródło