Oracle SQL'de 2 tarih / saat arasındaki farkı hesaplayın


89

Aşağıdaki gibi bir masam var:

Filename - varchar
Creation Date - Date format dd/mm/yyyy hh24:mi:ss
Oldest cdr date - Date format dd/mm/yyyy hh24:mi:ss

Oracle SQL'de iki tarih arasındaki saat, dakika ve saniye (ve muhtemelen gün) farkını nasıl hesaplayabilirim?

Teşekkürler


Yanıtlar:


120

Oracle'da tarihleri ​​çıkarabilirsiniz. Bu size gün cinsinden farkı verecektir. Saati elde etmek için 24 ile çarpın, vb.

SQL> select oldest - creation from my_table;

Tarihiniz karakter verisi olarak saklanıyorsa, önce onu bir tarih türüne dönüştürmeniz gerekir.

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

Not :

Bu cevap, Oracle veri türü tarafından temsil edilen tarihler için geçerlidir DATE. Oracle ayrıca TIMESTAMPbir tarihi de (zamanla) temsil edebilen bir veri türüne sahiptir . TIMESTAMPDeğerleri çıkarırsanız , bir INTERVAL; sayısal değerleri çıkarmak için EXTRACTişlevi kullanın .


3
Oracle'ın davranışında bir noktada bir değişiklik oldu mu? Bir tarihi diğerinden çıkardığımda INTERVALbasit bir kayan nokta değil bir veri türü elde ederim .

2
@JonofAllTrades: Hayır, tür değerlerini çıkardığınızda DATE, gün sayısını (a olarak NUMBER) alırsınız . Ancak, TIMESTAMPdeğerleri çıkarırsanız elde edersiniz INTERVALDS. Muhtemelen değerlerle TIMESTAMPdeğil , onlarla çalışıyorsunuz DATE. Cevabı düzenledim.
sleske

Notunuzu İlişkin - Hem DATEve TIMESTAMPveri türleri bir süre (saat, dakika ve saniye) bileşeni var. TIMESTAMPayrıca bir kesirli saniye zaman bileşenine (ve potansiyel olarak zaman dilimi bileşenlerine) sahiptir.
MT0

"Bu size gün cinsinden farkı verecektir." Oracle belgelerine bağlantı verebilir misiniz lütfen?
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 ;

Bu yardımcı olur umarım.


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] 
     );

Bu size Gün, Saat ve Dakika olarak üç sütun verecektir.


8

Şunu da deneyebilirsiniz:

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;

Saati, 00:01:34 gibi daha okunabilir bir biçimde görüntüler. Ayrıca günlere ihtiyacınız varsa, son biçimlendirme dizesine DD ekleyebilirsiniz.


7

Tarihleri ​​zaman damgalarına dönüştürmek ve bir çıkarma işlemi gerçekleştirmek için to_timestamp işlevini kullanabilirsiniz.

Gibi bir şey:

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

Hem to_date hem de to_timestamp'ı denedim ve her ikisi de bana günler içinde bir cevap veriyor, aşağı yuvarlanıyor, böylece fark 1 saat ise 0 cevabını 24 ile çarparsam 0 verir. Yazarsam doğru cevabı alırım tarih saati ancak bunu 25 milyon satır için yapamam. Düşüncesi olan var mı?
Steve

3
Zaman damgaları arasında bir çıkarma kullanarak size "GÜN SAAT: DAKİKA: SECS.milisecs" gibi bir formatta başka bir zaman damgası döndürecektir. İhtiyacınız değerini almak için bu trunc olabilir
HyLian

6
Zaman damgaları arasındaki çıkarma işlemi bir INTERVAL veri türü döndürür. Bir aralığın çeşitli bölümlerini döndürmek için EXTRACT işlevini kullanabilirsiniz, örneğin, ayıklamayı seçin (saat (zaman damgası '2009-12-31 14:00:00' - zaman damgası '2009-12-31 12:15:00')) saat ikiliden; Not: Bu yalnızca HOUR bölümünü gösterir, bu nedenle fark 1 gün ve 1 saat ise, bu 25 değil 1'i gösterecektir.
Gary Myers

5

HIREDATE'den bilgisayarınızın sistem tarihine kadar yaşı hesaplayın

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

Oracle 11g içinde

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

2

Eğer ' tablonuz'dan iki tarih seçerseniz ve sonucu tek bir sütun çıktısı olarak görmek istiyorsanız (örneğin' günler - ss: dd: ss ') bunun gibi bir şey kullanabilirsiniz. İlk önce bu iki tarih arasındaki aralığı hesaplayabilir ve bundan sonra ihtiyacınız olan tüm verileri bu aralıktan dışa aktarabilirsiniz:

         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

Ve bu size şöyle bir sonuç verecektir: 0 gün - 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

Biraz daha basit görünen bir şey istiyorsanız, son 1 dakika içinde gerçekleşen bir tablodaki olayları bulmak için şunu deneyin:

Bu girişle, istediğiniz dakika değerini elde edene kadar ondalık değerlerle oynayabilirsiniz. .0007 değeri, sysdate önemli basamaklar söz konusu olduğunda 1 dakika olur. İstediğiniz başka bir değeri elde etmek için bunun katlarını kullanabilirsiniz:

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

Sonuç 1 (dakika)

O zaman kontrol etmek basit bir konudur

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

Bu, tarihler arasındaki zamanı sayacaktır:

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

İşte başka bir seçenek:

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

İki zaman damgası sütununun zaman farkını döndürecek tek sorgu:

select INS_TS, MAIL_SENT_TS, extract( hour from (INS_TS - MAIL_SENT_TS) ) timeDiff 
from MAIL_NOTIFICATIONS;

0

Tarih almak istiyorsanız tablo ve sütun kullanarak erteleyin.

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;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.