1

我想计算时间“第二行日期/时间(F3)” - “第一行日期/时间(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' 
4

2 回答 2

1

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

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

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

于 2020-08-13T03:15:35.447 回答
1

下面试试。这'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

与 using 相同的功能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
于 2020-08-13T06:00:43.357 回答