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同一列中两条数据时间差计算的主要内容,如果未能解决你的问题,请参考以下文章