Sql同一列中两条数据时间差计算

Posted 观山海

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Sql同一列中两条数据时间差计算相关的知识,希望对你有一定的参考价值。

问题:从提出需求到需求通过,中间会经历不确定次数的“驳回->撤销驳回”的操作,所有的操作时间都位于同一列。求:需求从提出到通过经历的时间(不包含“驳回-撤销驳回”所消耗的时间)

PS: “驳回->撤销驳回”操作成对出现;且按时间顺序排列。

 

1. 建表

IF OBJECT_ID(\'tempdb..#logs\',\'U\')is NOT NULL DROP TABLE #logs
IF OBJECT_ID(\'tempdb..#logs2\',\'U\')is NOT NULL DROP TABLE #logs2
IF OBJECT_ID(\'tempdb..#logs3\',\'U\')is NOT NULL DROP TABLE #logs3

CREATE TABLE #logs(
    ODate DATETIME
    ,Operation VARCHAR(20)
    ,ID INT
);
INSERT INTO #logs VALUES(\'2018-08-09 09:00:00\',\'提交需求\',1);
INSERT INTO #logs VALUES(\'2018-08-09 10:00:00\',\'驳回\',1);
INSERT INTO #logs VALUES(\'2018-08-09 11:30:00\',\'撤销驳回\',1);
INSERT INTO #logs VALUES(\'2018-08-09 12:00:00\',\'驳回\',1);
INSERT INTO #logs VALUES(\'2018-08-09 13:10:00\',\'撤销驳回\',1);
INSERT INTO #logs VALUES(\'2018-08-09 13:50:00\',\'驳回\',1);
INSERT INTO #logs VALUES(\'2018-08-09 19:00:00\',\'撤销驳回\',1);
INSERT INTO #logs VALUES(\'2018-08-09 22:00:00\',\'通过\',1);

INSERT INTO #logs VALUES(\'2018-08-10 09:00:00\',\'提交需求\',2);
INSERT INTO #logs VALUES(\'2018-08-10 10:00:00\',\'驳回\',2);
INSERT INTO #logs VALUES(\'2018-08-11 11:30:00\',\'撤销驳回\',2);
INSERT INTO #logs VALUES(\'2018-08-11 12:00:00\',\'驳回\',2);
INSERT INTO #logs VALUES(\'2018-08-11 13:00:00\',\'撤销驳回\',2);
INSERT INTO #logs VALUES(\'2018-08-11 22:00:00\',\'通过\',2);

结果如图:

 

 

2. 按ID分组,对时间进行排序编号

--对时间进行排序并编号
SELECT ID,ODate,Operation,ROW_NUMBER() OVER (PARTITION BY id ORDER BY ODate)RowNum 
INTO #logs2 
FROM #logs

结果如图:

 

3. 将下一操作执行时间追加到本行末尾

--新增列:下一步操作的时间
SELECT ID,Operation,ODate AS ADate ,
(
    SELECT ODate FROM #logs2 WHERE rownum=t.rownum+1 and ID=t.id
)AS BDate
INTO #logs3 
FROM #logs2 t

 结果如图:

 

4. 计算结果

--计算需求提出到通过耗时(剔除驳回到撤销驳回耗时)
SELECT ID,SUM(DATEDIFF(MI,ADate,Bdate)) CostTime FROM #logs3
WHERE Operation<>\'驳回\'
GROUP BY ID

 

 

以上是关于Sql同一列中两条数据时间差计算的主要内容,如果未能解决你的问题,请参考以下文章

计算 3D 中两条线(线段)之间的最短距离

用于计算同一列的值百分比的 SQL [关闭]

如何获得 LLVM 中两条指令之间的距离?

针对同一列中的另一个计算窗口函数

选择同一表 SQL 中两列之间存在一对一匹配的行

如何在同一列或不同列的一个sql语句中两次使用'BETWEEN'条件