Oracle中的LAG函数

时间:2017-05-24 09:18:25

标签: sql oracle lag window-functions date-arithmetic

我有一个包含Create_date(DataType=Date)列的表(事件)。 我想在以前的记录中获得天数或小时数的差异。就像下面的截图一样。

从第二个记录Create_Date我想减去第一个Create_Date,从第三个创建日期到第二个,依此类推。我在Oracle中使用LAG函数,但不确定它是如何计算的。可以请任何人帮我解决这个问题。

incident.create_date - lag(incident.create_date,1) OVER (ORDER BY incident.create_date) AS CREATEDATE_DIFF,

RN 1我们有Create_date(05/01/017 10:40:17 AM

enter image description here

3 个答案:

答案 0 :(得分:3)

Oracle中的日期差异以天数计算。如果差异小于一天,您将获得小于1的值。

如果你想把它转换成几小时,你必须将结果乘以24,分钟乘以24 * 60,而秒则乘以24 * 60 * 60。

e.g:

select sysdate - trunc(sysdate) diff_in_days,
       (sysdate - trunc(sysdate))*24 diff_in_hours,
       (sysdate - trunc(sysdate))*24*60 diff_in_mins,
       (sysdate - trunc(sysdate))*24*60*60 diff_in_secs
from   dual;

DIFF_IN_DAYS DIFF_IN_HOURS DIFF_IN_MINS DIFF_IN_SECS
------------ ------------- ------------ ------------
0.4342245370 10.4213888888 625.28333333        37517

您可能希望应用ROUND(或者可能是TRUNC / CEIL),具体取决于您希望输出的样子(例如,到2 d.p.,到最近的分钟等)。

答案 1 :(得分:0)

使用

......
(incident.create_date - 
 lag(incident.create_date,1) OVER (ORDER BY incident.create_date))
 *24*60
 AS CREATEDATE_DIFF_IN_MINS,.....

获取minutes中的输出,该输出适合您的样本数据。或者再乘以60以获得seconds的输出。

答案 2 :(得分:0)

如果您从另一个日期中减去一个日期,您将获得天数(或其中的分数)作为数字的差异。

您可以使用间隔获取日期/小时/分钟/秒:

SELECT EXTRACT( DAY    FROM createdate_diff ) AS days,
       EXTRACT( HOUR   FROM createdate_diff ) AS hours,
       EXTRACT( MINUTE FROM createdate_diff ) AS minutes,
       EXTRACT( SECOND FROM createdate_diff ) AS seconds,
       createdate_diff
FROM   (
  SELECT NUMTODSINTERVAL(
           create_date - lag(create_date) OVER (ORDER BY create_date),
           'DAY'
         ) AS CREATEDATE_DIFF
  FROM   incident
);

或者您可以手动执行相同的计算:

SELECT TRUNC( createdate_diff ) AS days,
       TRUNC( MOD( createdate_diff * 24, 24 ) ) AS hours,
       TRUNC( MOD( createdate_diff * 24 * 60, 60 ) ) AS minutes,
       MOD( createdate_diff * 24 * 60 * 60, 60 ) AS seconds,
       createdate_diff
FROM   (
  SELECT create_date - lag(create_date) OVER (ORDER BY create_date)
           AS CREATEDATE_DIFF
  FROM   incident
);