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

原文地址:https://www.cnblogs.com/dunr/p/9452555.html

时间: 2024-11-05 22:05:25

Sql同一列中两条数据时间差计算的相关文章

mssql sqlserver 使用sql脚本实现相邻两条数据相减的方法分享

摘要: 下文讲述使用sql脚本实现相邻两条数据相减的方法,如下所示: 实验环境:sql server 2008 R2 实现思路: 1.使用cte表达式,对当前表进行重新编号 2.使用左连接对 表达式 生成的临时表进行错位连接,并对生成的新纪录中两列进行相减 create table [maomao365] (sort varchar(30),qty int); go ----生成基础数据 insert into [maomao365](sort, qty)values ('maomaoA',10

【转载】删除数据库中同样的两条数据中的一条

今天要修改一个离职同事写的代码,发现数据库有张表中会莫名其妙出项重复一模一样的两条数据, 由于数据不是很多想在管理工具里面手动删除算了,但是发现删除不掉,感觉像是两条数据关联起来了, 想想应该是管理工具后台逻辑估计也是用语句实现,由于没有主键,更本没法判断我要操作那条数据, 于是就报错了,我真心想吐槽一下这家伙设计的数据库真牛X. 于是就搜到了下面这篇解决方案: http://hi.baidu.com/wangzhiqing99/item/257cc01792e536afffded529

SQL SERVER 数据库中几百万数据查询优化

1.当需要查询表中所有数据时 比较以下三种查询语句: 假设数据表为BasicMsg20170401,共有17列,数据条数为两百八十四万 (1)SELECT * FROM  BasicMsg20170401 耗时44秒以上 (2)SELECT 列1,列2... FROM  BasicMsg20170401 耗时28~30秒上下 (3)SELECT 列1,列2... FROM  BasicMsg20170401 WITH  (index(SelAA_Index) ) 强制加入非聚集索引后,耗时23~

php执行一条insert插入两条数据其中一条乱码

显然这就是编码问题,但是问题从哪来的呢, 我把文件编码以及代码的编码都设置成utf-8了,为什么还有这个问题于是我就开始写测试脚本 第一条 mysql_query('insert into table value(1,1,"思考思考123")') 测试没有问题 第二条 $name=$_GET["name"]; mysql_query('insert into table value(1,1,"'.$name.'")') 测试出问题了,数据库竟然插

清空SQL Server数据库中所有表数据的方法

其实删除数据库中数据的方法并不复杂,为什么我还要多此一举呢,一是我这里介绍的是删除数据库的所有数据,因为数据之间可能形成相互约束关系,删除操作可能陷入死循环,二是这里使用了微软未正式公开的sp_MSForEachTable存储过程. 也许很多读者朋友都经历过这样的事情:要在开发数据库基础上清理一个空库,但由于对数据库结构缺乏整体了解,在删除一个表的记录时,删除不了,因为可能有外键约束,一个常见的数据库结构是一个主表,一个子表,这种情况下一般都得先删除子表记录,再删除主表记录. 说道删除数据记录,

在3D中两条射线的相交性检测

摘自[3D数学基础: 图形与游戏开发] 考虑在3D中两条以参数形式定义的射线: \(\vec{r_1}(t_1)=\vec{p_1}+t_1\vec{d_1}\) \(\vec{r_2}(t_2)=\vec{p_2}+t_2\vec{d_2}\) 我们能够解得它们的交点.暂时先不考虑\(t_1,t_2\)的取值范围.因此,我们考虑的是无限长的射线:同样,向量\(\vec{d_1},\vec{d_2}\)也不必是单位向量.如果这两条射线在一个平面中,那么和前一节的情况一样,也存在有一种可能性: 两

SQL Server数据库中导入导出数据及结构时主外键关系的处理

2015-01-26 软件开发中,经常涉及到不同数据库(包括不同产品的不同版本)之间的数据结构与数据的导入导出.处理过程中会遇到很多问题,尤为突出重要的一个问题就是主从表之间,从表有外检约束,从而导致部分数据无法导入. 情景一.同一数据库产品,相同版本 此种情况下源数据库与目标数据库的数据结构与数据的导入导出非常简单. 方法1:备份源数据库,恢复到目标数据库即完成. 方法2:使用SQL Sever数据库自带的[复制数据库]功能或者[导入数据]功能按照向导操作即可. 情景二.同一数据库产品,不同版

SQL 高效分页(百万条数据)

第一种方法效率最高 SELECT TOP 页大小 * FROM ( <span style="white-space:pre"> </span>SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNumber,* FROM table1 ) as A WHERE RowNumber > 页大小*(页数-1) 注解:首先利用Row_number()为table1表的每一行添加一个行号,给行号这一列取名'RowNumber

怎么在SQL Server 2008中还原.mdf数据文件

还原数据库文件的过程中,只有mdf文件,该怎么还原?在原来的SQL Server 2005中直接点击数据库然后附加就可以还原,但是在2008 版本中附加数据库文件则会出错(只有mdf文件){执行Transact-SQL语句或处理时发生异常}那么现在就可以打开数据库的两个文件(mdf,ldf),右键属性, 选择Administrators(也就是本机用户),将权限修改为完全控制,同样另外的文件也按照这样操作,然后按照上面的步骤还原数据库.另外一种方法是将上面的两个文件直接复制到系统数据库的默认目录