Saya memiliki tabel sebagai berikut:
Filename - varchar
Creation Date - Date format dd/mm/yyyy hh24:mi:ss
Oldest cdr date - Date format dd/mm/yyyy hh24:mi:ss
Bagaimana cara menghitung perbedaan jam menit dan detik (dan mungkin hari) antara dua tanggal di Oracle SQL?
Terima kasih
oracle
date-arithmetic
Steve
sumber
sumber
Jawaban:
Anda dapat mengurangi tanggal di Oracle. Ini akan memberi Anda perbedaan dalam beberapa hari. Kalikan dengan 24 untuk mendapatkan jam, dan seterusnya.
SQL> select oldest - creation from my_table;
Jika tanggal Anda disimpan sebagai data karakter, Anda harus mengubahnya menjadi jenis tanggal terlebih dahulu.
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
Catatan :
Jawaban ini berlaku untuk tanggal yang diwakili oleh tipe data Oracle
DATE
. Oracle juga memiliki tipe dataTIMESTAMP
, yang juga dapat mewakili tanggal (dengan waktu). Jika Anda mengurangiTIMESTAMP
nilai, Anda mendapatkanINTERVAL
; untuk mengekstrak nilai numerik, gunakanEXTRACT
fungsi.sumber
INTERVAL
tipe data, bukan pelampung sederhana.DATE
, Anda mendapatkan jumlah hari (sebagai aNUMBER
). Namun, jika Anda mengurangiTIMESTAMP
nilai, Anda mendapatkanINTERVALDS
. Mungkin Anda bekerja denganTIMESTAMP
dan bukanDATE
nilai. Saya mengedit jawabannya.DATE
maupunTIMESTAMP
memiliki komponen waktu (jam, menit dan detik).TIMESTAMP
juga memiliki komponen waktu pecahan detik (dan berpotensi komponen zona waktu).Untuk mendapatkan hasil dalam hitungan detik:
select (END_DT - START_DT)*60*60*24 from MY_TABLE;
Lihat [ https://community.oracle.com/thread/2145099?tstart=0][1]
sumber
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 ;
Semoga ini membantu.
sumber
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] );
Ini akan memberi Anda tiga kolom sebagai Hari, Jam dan Menit.
sumber
Anda juga dapat mencoba ini:
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;
Ini menampilkan waktu dalam bentuk yang lebih dapat dibaca manusia, seperti: 00:01:34. Jika Anda juga membutuhkan hari, Anda dapat menambahkan DD ke string pemformatan terakhir.
sumber
Anda bisa menggunakan fungsi to_timestamp untuk mengubah tanggal menjadi cap waktu dan melakukan operasi pengurangan.
Sesuatu seperti:
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
sumber
Hitung usia dari HIREDATE hingga tanggal sistem komputer Anda
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;
sumber
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 );
sumber
Dalam oracle 11g
SELECT end_date - start_date AS day_diff FROM tablexxx suppose the starT_date end_date is define in the tablexxx
sumber
Jika Anda memilih dua tanggal dari ' tabel_Anda ' dan ingin juga melihat hasilnya sebagai keluaran kolom tunggal (mis. ' Hari - jj: mm: dd ') Anda dapat menggunakan sesuatu seperti ini. Pertama, Anda dapat menghitung interval antara dua tanggal ini dan setelah itu mengekspor semua data yang Anda butuhkan dari interval itu:
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
Dan itu akan memberi Anda hasil seperti ini: 0 hari - 1:14:55
sumber
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
sumber
Jika Anda menginginkan sesuatu yang terlihat sedikit lebih sederhana, coba ini untuk menemukan peristiwa dalam tabel yang terjadi dalam 1 menit terakhir:
Dengan entri ini Anda dapat mengutak-atik nilai desimal sampai Anda mendapatkan nilai menit yang Anda inginkan. Nilai .0007 terjadi selama 1 menit sejauh menyangkut digit signifikan sysdate. Anda bisa menggunakan kelipatannya untuk mendapatkan nilai lain yang Anda inginkan:
select (sysdate - (sysdate - .0007)) * 1440 from dual;
Hasilnya 1 (menit)
Maka itu adalah masalah sederhana untuk diperiksa
select * from my_table where (sysdate - transdate) < .00071;
sumber
sumber
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;
sumber
$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'";
sumber
Ini akan menghitung waktu antara sampai tanggal:
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
sumber
Berikut opsi lain:
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;
sumber
Kueri tunggal yang akan mengembalikan perbedaan waktu dari dua kolom stempel waktu:
select INS_TS, MAIL_SENT_TS, extract( hour from (INS_TS - MAIL_SENT_TS) ) timeDiff from MAIL_NOTIFICATIONS;
sumber
Jika Anda ingin mendapatkan penangguhan tanggal dari penggunaan tabel dan kolom.
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;
sumber