2009-07-08 41 views
63

Tôi có một bảng như sau:Tính khác biệt giữa 2 ngày/lần trong Oracle SQL

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

Làm thế nào tôi có thể calcuate sự khác biệt trong giờ phút và giây (và có thể ngày) giữa hai thời điểm trong Oracle SQL ?

Cảm ơn

+0

Gần trùng lặp: http://stackoverflow.com/questions/9322935/subtracting-dates-in-oracle-number-or-interval-datatype –

Trả lời

93

Bạn có thể trừ ngày trong Oracle. Điều này sẽ cho bạn sự khác biệt trong ngày. Nhân với 24 để nhận giờ, v.v.

SQL> select oldest - creation from my_table; 

Nếu ngày của bạn được lưu dưới dạng dữ liệu ký tự, trước tiên bạn phải chuyển nó thành loại ngày.

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 

Note:

câu trả lời này áp dụng cho ngày đại diện bởi các kiểu dữ liệu Oracle DATE. Oracle cũng có kiểu dữ liệu TIMESTAMP, cũng có thể đại diện cho một ngày (với thời gian). Nếu bạn trừ các giá trị TIMESTAMP, bạn sẽ nhận được INTERVAL; để trích xuất các giá trị số, hãy sử dụng hàm EXTRACT.

+2

Đã có sự thay đổi trong hành vi của Oracle tại một số điểm chưa? Khi tôi trừ một ngày từ một ngày khác, tôi nhận được một kiểu dữ liệu 'INTERVAL', không phải là một phao đơn giản. –

+1

@JonofAllTrades: Không, khi bạn trừ các giá trị của loại 'DATE', bạn nhận được số ngày (dưới dạng' NUMBER'). Tuy nhiên, nếu bạn trừ 'TIMESTAMP' giá trị, bạn nhận được' INTERVALDS'. Có lẽ bạn đang làm việc với 'TIMESTAMP' và không phải' DATE' giá trị. Tôi đã chỉnh sửa câu trả lời. – sleske

+0

Về ghi chú của bạn - Cả hai loại dữ liệu 'DATE' và' TIMESTAMP' đều có thành phần thời gian (giờ, phút và giây). 'TIMESTAMP' cũng có một thành phần thời gian phân số giây (và các thành phần múi giờ tiềm năng). – MT0

5

Bạn có thể sử dụng hàm to_timestamp để chuyển đổi ngày thành dấu thời gian và thực hiện thao tác trừ.

Cái gì như:

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 
+6

đơn vị này sẽ cung cấp cái gì? giờ? mili giây? slivers? – skaffman

+0

Tôi đã thử cả hai to_date và to_timestamp và cả hai cho tôi một câu trả lời trong ngày, làm tròn xuống vì vậy nếu sự khác biệt là 1 giờ tôi nhận được một câu trả lời là 0, nhân này bằng 24 cho 0. Tôi nhận được câu trả lời đúng nếu tôi gõ trong thời gian ngày nhưng tôi không thể làm điều này cho 25m hàng. Có suy nghĩ gì không? – Steve

+3

Sử dụng cơ chế giữa các dấu thời gian, nó sẽ trả lại cho bạn một dấu thời gian khác theo định dạng như "DAYS HOUR: MINS: SECS.milisecs". Bạn có thể cắt xén để lấy giá trị bạn cần – HyLian

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

tuổi Tính từ HIREDATE đến nay hệ thống máy tính của bạ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; 
13
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 ; 

Hope this helps.

0

này sẽ đếm thời gian giữa đến ngày:

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

Đây là một lựa chọn:

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; 
2
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); 
0
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 
9
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] 
    ); 

này sẽ cung cấp cho bạn ba cột như ngày, giờ và Phút.

3

Bạn cũng có thể thử điều này:

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; 

Nó hiển thị thời gian theo dạng dễ đọc hơn, như: 0:01:34. Nếu bạn cũng cần ngày, bạn có thể chỉ cần thêm DD vào chuỗi định dạng cuối cùng.

0

trong oracle 11g

chọn end_date - start_date như day_diff từ tablexxx giả sử end_date start_date là xác định trong tablexxx

1

Nếu bạn muốn một cái gì đó trông đơn giản hơn một chút, hãy thử điều này để tìm kiếm sự kiện n một bảng đã xảy ra trong 1 phút qua:

Với mục này bạn có thể fiddle với các giá trị thập phân cho đến khi bạn nhận được giá trị phút mà bạn muốn. Giá trị .0007 xảy ra là 1 phút khi các chữ số quan trọng sysdate có liên quan. Bạn có thể sử dụng bội số của rằng để có được bất kỳ giá trị khác mà bạn muốn:

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

Kết quả là 1 (phút)

Sau đó, nó là một vấn đề đơn giản để kiểm tra

select * from my_table where (sysdate - transdate) < .00071; 
+0

.0007 được mã hóa cứng, vui lòng sửa – user1012506

0
(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 
Các vấn đề liên quan