Hitung perbedaan antara 2 tanggal / waktu di Oracle SQL


89

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


Jawaban:


120

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 data TIMESTAMP, yang juga dapat mewakili tanggal (dengan waktu). Jika Anda mengurangi TIMESTAMPnilai, Anda mendapatkan INTERVAL; untuk mengekstrak nilai numerik, gunakan EXTRACTfungsi.


3
Apakah ada perubahan dalam perilaku Oracle di beberapa titik? Ketika saya mengurangi satu tanggal dari yang lain, saya mendapatkan INTERVALtipe data, bukan pelampung sederhana.

2
@JonofAllTrades: Tidak, saat Anda mengurangi nilai tipe DATE, Anda mendapatkan jumlah hari (sebagai a NUMBER). Namun, jika Anda mengurangi TIMESTAMPnilai, Anda mendapatkan INTERVALDS. Mungkin Anda bekerja dengan TIMESTAMPdan bukan DATEnilai. Saya mengedit jawabannya.
sleske

Mengenai catatan Anda - Baik tipe data DATEmaupun TIMESTAMPmemiliki komponen waktu (jam, menit dan detik). TIMESTAMPjuga memiliki komponen waktu pecahan detik (dan berpotensi komponen zona waktu).
MT0

"Ini akan memberimu perbedaan dalam beberapa hari." Bisakah Anda menautkan ke dokumentasi Oracle?
Roland


16
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.


14
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.


8

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.


7

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

Saya telah mencoba to_date dan to_timestamp dan keduanya memberi saya jawaban dalam beberapa hari, dibulatkan ke bawah jadi jika perbedaannya adalah 1 jam saya menerima jawaban 0, mengalikannya dengan 24 menghasilkan 0. Saya menerima jawaban yang benar jika saya mengetik tanggal waktu tetapi saya tidak bisa melakukan ini untuk baris 25m. Ada pemikiran?
Steve

3
Menggunakan substraksi di antara stempel waktu, ia akan mengembalikan stempel waktu lain dalam format seperti "DAYS HOUR: MINS: SECS.milisecs". Anda bisa memotong ini untuk mendapatkan nilai yang Anda butuhkan
HyLian

6
Pengurangan antara stempel waktu mengembalikan tipe data INTERVAL. Anda dapat menggunakan fungsi EKSTRAK untuk mengembalikan berbagai bagian interval misalnya pilih ekstrak (jam dari (timestamp '2009-12-31 14:00:00' - timestamp '2009-12-31 12:15:00')) jam dari ganda; Catatan: Itu hanya menunjukkan bagian JAM, jadi jika perbedaannya 1 hari dan 1 jam, ini akan menunjukkan 1 bukan 25.
Gary Myers

5

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;

3
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

Dalam oracle 11g

SELECT end_date - start_date AS day_diff FROM tablexxx
suppose the starT_date end_date is define in the tablexxx

2

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


1
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

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;

1
(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
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;  

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

0

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

0

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;

0

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;

0

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;
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.