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

Ste*_*ve 80 oracle date-arithmetic

我有一张表如下:

Filename - varchar
Creation Date - Date format dd/mm/yyyy hh24:mi:ss
Oldest cdr date - Date format dd/mm/yyyy hh24:mi:ss
Run Code Online (Sandbox Code Playgroud)

如何计算Oracle SQL中两个日期之间的小时分钟和秒(以及可能的天数)的差异?

谢谢

Thi*_*ilo 111

您可以在Oracle中减去日期.这将给你几天的差异.乘以24得到小时,依此类推.

SQL> select oldest - creation from my_table;
Run Code Online (Sandbox Code Playgroud)

如果您的日期存储为字符数据,则必须先将其转换为日期类型.

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
Run Code Online (Sandbox Code Playgroud)

注意:

此答案适用于Oracle数据类型表示的日期DATE.Oracle还有一种数据类型TIMESTAMP,它也可以表示日期(随时间).如果你减去TIMESTAMP价值,你会得到一个INTERVAL; 要提取数值,请使用该EXTRACT函数.

  • 甲骨文在某些方面的行为是否发生了变化?当我从另一个日期中减去一个日期时,我得到一个`INTERVAL`数据类型,而不是一个简单的浮点数. (3认同)
  • @JonofAllTrades:不,当减去类型为“ DATE”的值时,您将获得天数(为“ NUMBER”)。但是,如果减去“ TIMESTAMP”值,则会得到“ INTERVALDS”。可能您正在使用“ TIMESTAMP”而不是“ DATE”值。我编辑了答案。 (2认同)

Moh*_*ari 15

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 ;
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.


Nik*_*ick 15

要在几秒钟内获得结果:

select (END_DT - START_DT)*60*60*24 from MY_TABLE;
Run Code Online (Sandbox Code Playgroud)

检查[ https://community.oracle.com/thread/2145099?tstart=0][1]


小智 13

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] 
     );
Run Code Online (Sandbox Code Playgroud)

这将为您提供三列,分别为天,小时和分钟.


HyL*_*ian 6

您可以使用to_timestamp函数将日期转换为时间戳并执行子操作.

就像是:

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
Run Code Online (Sandbox Code Playgroud)

  • 这给了什么单位?小时?毫秒?条子? (6认同)
  • 时间戳之间的减法返回INTERVAL数据类型.您可以使用EXTRACT函数返回间隔的各个部分,例如select extract((timestamp'2009-12-31 14:00:00' - timestamp'2009-12-31 12:15:00')hr来自双重; 注意:这仅显示HOUR部分,因此如果差异为1天1小时,则显示1而不是25. (6认同)
  • 在时间戳之间使用减法,它将以"DAYS HOUR:MINS:SECS.milisecs"之类的格式返回另一个时间戳.您可以截断它以获得所需的值 (3认同)

小智 5

计算从HIREDATE到计算机系统日期的年龄

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;
Run Code Online (Sandbox Code Playgroud)


RLa*_*ski 5

您也可以尝试以下方法:

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;
Run Code Online (Sandbox Code Playgroud)

它以更易理解的形式显示时间,例如:00:01:34。如果您还需要几天的时间,则只需将DD添加到最后一个格式化字符串中即可。