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

在ORACLE中计算不同行中同一字段的时差,输出格式为HH:MM:SS,oracle,oracle-sqldeveloper,oracle-sql-data-modeler,Oracle,Oracle Sqldeveloper,Oracle Sql Data Modeler,我想计算时间“第二行日期/时间(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_act

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

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

Trunc(delta*24) = hours
Mod(trunc(delta*24*60),60) = minutes
Mod(trunc(delta*24*60*60),60) = seconds
还有另一种简单的方法:将delta添加到任何常量日期,并使用simple to_char。例如:
to_char(日期'2020-01-01'+增量'hh24:mi:ss')

但是如果delta>1天,您需要将天数*24添加到小时,或者使用12月31日作为固定日期,并将“dd”添加到格式掩码中,请尝试下面的操作。这里的
'1900-01-01'
到\u 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

嗨@Sayan,但我如何申请我的查询?我需要从第2列-第1列中减去日期/时间。对不起,我不明白你的意思。我是oracle的新手。嗨,ismetguzelgun,我已经尝试过你的方法,如果我指定了值,那么它就可以工作了,但是现在我需要减去相同的列,但是在不同的行中,例如:相同的列Datetime[2]-Datetime[1]。这就是为什么我使用滞后函数来计算时间差,但我不知道如何将这种方法应用到滞后函数中。谢谢。编辑了我的答案@YongHi ismetguzelgun,我面临一个问题,我的计算在5行中的第一行是正确的,但在第6行计算后是不正确的,然后下一行计算又回到正确的计算。很可能是因为使用了滞后函数。以某种方式或另一种方式,滞后无法在值本身和获取空值或错误值之前找到数据。这就是你面临这个问题的原因。您可以尝试在结束后按语句放置PARTITION BY(如果有任何列可用于分隔)。写一些包含您的问题的示例数据,让我们看看。嗨,ismetguzelgun,我尝试添加PARTITION BY,但似乎遇到了相同的问题。我已附上了从数据库查询出的照片。谢谢