计算Oracle SQL中2个date/时间之间的差异

我有一个表格如下:

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中两个date之间在几分钟和几秒之内(以及可能的几天)的差异?

谢谢

您可以在Oracle中减去date。 这会在几天内给你带来差异。 乘以24得到小时,依此类推。

 SQL> select oldest - creation from my_table; 

如果您的date存储为字符数据,则必须先将其转换为datetypes。

 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 

注意

此答案适用于由Oracle数据typesDATE表示的DATE 。 Oracle也有一个数据typesTIMESTAMP ,它也可以表示一个date(带时间)。 如果你减去TIMESTAMP值,你会得到一个INTERVAL ; 要提取数字值,请使用EXTRACT函数。

 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 ; 

希望这可以帮助。

 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_timestamp函数将date转换为时间戳并执行减法操作。

就像是:

 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 

以秒为单位获得结果:

 select (END_DT - START_DT)*60*60*24 from MY_TABLE; 

检查[ https://community.oracle.com/thread/2145099?tstart=0%5D%5B1%5D

计算从HIREDATE到计算机系统date的年龄

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

你也可以试试这个:

 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; 

它以更可读的forms显示时间,如:00:01:34。 如果你还需要几天,你可以简单地添加DD到最后格式化string。

如果你想要一些看起来更简单的东西,可以尝试在过去1分钟内发现一个表中的事件:

有了这个条目,你可以摆弄十进制值,直到你得到你想要的分钟值。 就sysdate有效位数而言,值0.0007恰好是1分钟。 您可以使用它的倍数来获得您想要的任何其他值:

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

结果是1(分钟)

那么检查是一件简单的事情

 select * from my_table where (sysdate - transdate) < .00071; 
 $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'"; 

这将计算到date之间的时间:

 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 

这是另一个select:

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

在oracle 11g中

从tablexxx中selectend_date – start_date as day_diff假设starT_date end_date在表中定义了

variables:P_comapre_date包含最旧的值,也可以replaceSYSDATE

 SELECT MAX(MONTHS_BETWEEN(SYSDATE,:P_comapre_date)/12) FROM dual