计算 ORACLE 中不同行中相同字段的时间差,输出格式为 HH:MM:SS

Calculate TIME Difference in ORACLE for same field in different row with output in HH:MM:SS format

我想计算时间“第二行Date/Time(F3)”-“第一行Date/Time(F2)”,得到ORACLE中的时间差sql。 我尝试以我的方式在 LAG 函数中使用 (extract,to_char)apply 来减去日期,但我无法获得我想要的输出结果,如下所示。感谢有人可以帮助我解决这个问题。谢谢

[我希望得到的输出][2]

SELECT stg_rmstmp_cj.ota_activity.ID,
stg_rmstmp_cj.ota_activity.LOT,stg_rmstmp_cj.ota_activity.TYPE,stg_rmstmp_cj.ota_activity.KEY, stg_rmstmp_cj.ota_activity.VALUE,A.DATE,
LAG(stg_rmstmp_cj.ota_activity.DATE) OVER (ORDER BY stg_rmstmp_cj.ota_activity.DATE) -stg_rmstmp_cj.ota_activity.DATE AS Different_time 
FROM stg_rmstmp_cj.ota_activity where A.ID='93K-100';

这是我最近在添加分区时遇到的新错误,但似乎它确实解决了附上屏幕截图示例的问题:

select EQP_ID,LOT_ID,ACTIVITY,ID,
TO_CHAR(MODIFIED_DATE,'yyyy-mm-dd hh24:mi:ss') dt,
TO_CHAR (DATE '1900-01-01' + ABS ( LAG(MODIFIED_DATE,1)OVER(ORDER BY MODIFIED_DATE) - MODIFIED_DATE), 'HH24:MI:SS')AS diff_withoutpartition,
TO_CHAR (DATE '1900-01-01' + ABS ( LAG(MODIFIED_DATE,1)OVER(PARTITION BY EQP_ID ORDER BY MODIFIED_DATE) - MODIFIED_DATE), 'HH24:MI:SS')AS diff_withpartition
from STG_RMSTMP_CJ.ota_activity where EQP_ID = '93K-P007' 

Date-Date returns 数字,其中1等于1天,因此您可以轻松计算小时数、分钟数和秒数:

Trunc(delta*24) = hours
Mod(trunc(delta*24*60),60) = minutes
Mod(trunc(delta*24*60*60),60) = seconds

还有另一种简单的方法:将delta添加到任何常量日期并使用简单的to_char。例如:to_char(date'2020-01-01' + delta, 'hh24:mi:ss') 但是您需要将天数 * 24 添加到小时,以防 delta>1 天,或者使用 12 月 31 日作为常量日期并将 'dd' 添加到格式 mask

试试下面的方法。这里 '1900-01-01'TO_CHAR 正常工作的虚拟对象。

WITH MAIN
     AS (SELECT TO_DATE ('20200515 19:11:54', 'yyyymmdd hh24:mi:ss') DAT1,
                TO_DATE ('20200515 18:11:54', 'yyyymmdd hh24:mi:ss') DAT2
           FROM DUAL)
SELECT DAT1,
       DAT2,
       TO_CHAR (DATE '1900-01-01' + ABS (DAT1 - DAT2), 'HH24:MI:SS')
  FROM MAIN

与使用 LAG 相同的功能。

WITH MAIN
     AS (SELECT TO_DATE ('20200515 19:11:54', 'yyyymmdd hh24:mi:ss') DAT1,
                TO_DATE ('20200515 18:11:54', 'yyyymmdd hh24:mi:ss') DAT2
           FROM DUAL
           UNION ALL
           SELECT TO_DATE ('20200514 19:12:54', 'yyyymmdd hh24:mi:ss') DAT1,
                TO_DATE ('20200514 16:12:54', 'yyyymmdd hh24:mi:ss') DAT2
           FROM DUAL
           )
SELECT DAT1,
       DAT2,
       LAG(DAT1,1)OVER(ORDER BY DAT1) LAG,
       TO_CHAR (DATE '1900-01-01' + ABS ( LAG(DAT1,1)OVER(ORDER BY DAT1) - DAT1), 'HH24:MI:SS')
  FROM MAIN