计算 SQL Server 和 Oracle 中组中以及特定数据范围之间的持续时间

问题描述 投票:0回答:1

我的数据结果集格式如下图所示,

对于同一个 bill_no ,我需要找到状态 id 1200 和 1350 之间的时间差(格式为小时:分钟:秒)。时间差是根据相应状态 id 的“datetime”列计算的。正在寻找 MSSQL 和 Oracle 的查询。

sql-server plsql
1个回答
0
投票

甲骨文:
下面是 Oracle 代码计算同一 BILL_NO 的每一行与 BILL_NO 第一行的时间差 (hh24:mi:ss)

WITH      --  S a m p l e   D a t a :
    tbl (STATUSID, REASON, DATETIME, BILL_NO) AS
        ( Select 1200, 'AVPR-PJMBIF01:BF18', To_Date('2023-12-23 05:07:37', 'yyyy-mm-dd hh24:mi:ss'), 'TRIAL-54467880555' From Dual Union All
          Select 1325, 'PDF bill generation started', To_Date('2023-12-23 05:07:37', 'yyyy-mm-dd hh24:mi:ss'), 'TRIAL-54467880555' From Dual Union All
          Select 1375, 'Adding PDF decorations', To_Date('2023-12-23 05:07:38', 'yyyy-mm-dd hh24:mi:ss'), 'TRIAL-54467880555' From Dual Union All
          Select 1350, 'PDF bill generated successfuly', To_Date('2023-12-23 05:07:38', 'yyyy-mm-dd hh24:mi:ss'), 'TRIAL-54467880555' From Dual 
        )
--  M a i n   S Q L :
Select  STATUSID, REASON, DATETIME, BILL_NO, 
        -- hours
        LPAD(FLOOR((DATETIME - FIRST_VALUE(DATETIME) Over(Partition By BILL_NO Order By DATETIME)) * 24), 2, '0') || ':' ||
        -- minutes
        LPAD(FLOOR(((DATETIME - FIRST_VALUE(DATETIME) Over(Partition By BILL_NO Order By DATETIME)) * 24 * 60) - 
            (FLOOR((DATETIME - FIRST_VALUE(DATETIME) Over(Partition By BILL_NO Order By DATETIME)) * 24) * 60)), 2, '0') || ':' || 
        -- seconds
        LPAD(Round(((DATETIME - FIRST_VALUE(DATETIME) Over(Partition By BILL_NO Order By DATETIME)) * 24 * 60 * 60) -                            
            (FLOOR((DATETIME - FIRST_VALUE(DATETIME) Over(Partition By BILL_NO Order By DATETIME)) * 24) * 60 * 60 ) - 
            ((FLOOR(((DATETIME - FIRST_VALUE(DATETIME) Over(Partition By BILL_NO Order By DATETIME)) * 24 * 60) -                     
            (FLOOR((DATETIME - FIRST_VALUE(DATETIME) Over(Partition By BILL_NO Order By DATETIME)) * 24) * 60))) * 60 ), 0), 2, '0') "SINCE_BILL_NO_START"
From    tbl 
/*    R e  s u l t :
  STATUSID REASON                         DATETIME BILL_NO           SINCE_BILL_NO_START
---------- ------------------------------ -------- ----------------- -------------------
      1200 AVPR-PJMBIF01:BF18             23.12.23 TRIAL-54467880555 00:00:00
      1325 PDF bill generation started    23.12.23 TRIAL-54467880555 00:00:00
      1375 Adding PDF decorations         23.12.23 TRIAL-54467880555 00:00:01
      1350 PDF bill generated successfuly 23.12.23 TRIAL-54467880555 00:00:01           */
© www.soinside.com 2019 - 2024. All rights reserved.