计算Oracle中两个时间戳之间的差异,以毫秒为单位

sar*_*ake 51 sql oracle datetime

如何计算Oracle中两个时间戳之间的时差(以毫秒为单位)?

Jus*_*ave 74

当你减去两个类型的变量时TIMESTAMP,你会得到一个INTERVAL DAY TO SECOND包括毫秒和/或微秒的数量,具体取决于平台.如果数据库在Windows上运行,systimestamp通常会有毫秒.如果数据库在Unix上运行,systimestamp通常会有几微秒.

  1  select systimestamp - to_timestamp( '2012-07-23', 'yyyy-mm-dd' )
  2*   from dual
SQL> /

SYSTIMESTAMP-TO_TIMESTAMP('2012-07-23','YYYY-MM-DD')
---------------------------------------------------------------------------
+000000000 14:51:04.339000000
Run Code Online (Sandbox Code Playgroud)

您可以使用该EXTRACT函数来提取单个元素INTERVAL DAY TO SECOND

SQL> ed
Wrote file afiedt.buf

  1  select extract( day from diff ) days,
  2         extract( hour from diff ) hours,
  3         extract( minute from diff ) minutes,
  4         extract( second from diff ) seconds
  5    from (select systimestamp - to_timestamp( '2012-07-23', 'yyyy-mm-dd' ) diff
  6*           from dual)
SQL> /

      DAYS      HOURS    MINUTES    SECONDS
---------- ---------- ---------- ----------
         0         14         55     37.936
Run Code Online (Sandbox Code Playgroud)

然后,您可以将每个组件转换为毫秒并添加它们

SQL> ed
Wrote file afiedt.buf

  1  select extract( day from diff )*24*60*60*1000 +
  2         extract( hour from diff )*60*60*1000 +
  3         extract( minute from diff )*60*1000 +
  4         round(extract( second from diff )*1000) total_milliseconds
  5    from (select systimestamp - to_timestamp( '2012-07-23', 'yyyy-mm-dd' ) diff
  6*           from dual)
SQL> /

TOTAL_MILLISECONDS
------------------
          53831842
Run Code Online (Sandbox Code Playgroud)

但是,通常情况下,使用INTERVAL DAY TO SECOND表示或具有小时,分钟,秒等的单独列更有用,而不是计算两个TIMESTAMP值之间的总毫秒数.

  • @Bruno - 如果数据类型是"TIMESTAMP WITH TIME ZONE",则减去两者的间隔应该处理任何时区/夏令时转换.因此从太平洋凌晨2点的"TIMESTAMP WITH TIME ZONE"中减去东部早上5点的"TIMESTAMP WITH TIME ZONE"将导致0秒的间隔.如果您只使用没有时区的标准`TIMESTAMP`,则没有时区存储为数据的一部分,因此无法进行此类更正. (3认同)

Bri*_*ity 24

这是一个存储过程来执行此操作:

CREATE OR REPLACE function timestamp_diff(a timestamp, b timestamp) return number is 
begin
  return extract (day    from (a-b))*24*60*60 +
         extract (hour   from (a-b))*60*60+
         extract (minute from (a-b))*60+
         extract (second from (a-b));
end;
/
Run Code Online (Sandbox Code Playgroud)

如果您还希望打败那些否定他的工作的Oracle开发人员,请投票!

因为第一次比较时间戳应该花大约一个小时左右......

  • 我认为甲骨文的座右铭是"我们本可以让你这么容易,但我们认为让你受苦更有趣." +1 (7认同)
  • "我们很难写它,所以你应该很难使用它" (3认同)
  • 我怀疑这是一个单一的开发人员提出了这种复杂程度.我怀疑这是委员会的设计 (2认同)

pat*_*515 15

更简单的解决方案

SELECT numtodsinterval(date1-date2,'day') time_difference from dates;
Run Code Online (Sandbox Code Playgroud)

对于时间戳:

SELECT (extract(DAY FROM time2-time1)*24*60*60)+ 
(extract(HOUR FROM time2-time1)*60*60)+
(extract(MINUTE FROM time2-time1)*60)+
extract(SECOND FROM time2-time1)
into diff FROM dual;

RETURN diff;
Run Code Online (Sandbox Code Playgroud)


pha*_*unk 5

Select date1 - (date2 - 1) * 24 * 60 *60 * 1000 from Table;
Run Code Online (Sandbox Code Playgroud)

  • 我猜你的意思是** SELECT((timestamp1-1)-(timestamp2-1))* 86400000 from Table; **即使我选择了“ +0” ;-),我也喜欢它。但是我认为您会损失毫秒精度,因为“ -1”似乎将TIMESTAMP转换为DATE(没有毫秒)。 (3认同)