mssql存储过程,怎么过滤数据库中时间段重复的数据,获得实际时间
mssql存储过程,如何过滤数据库中时间段重复的数据,获得实际时间?
如:id begintime endtime
1 2014-04-18 10:00:00 2014-04-18 10:50:00
1 2014-04-18 10:30:00 2014-04-18 11:00:00
1 2014-04-18 10:10:00 2014-04-18 12:30:00
1 2014-04-18 10:10:00 2014-04-18 12:30:00
1 2014-04-18 11:30:00 2014-04-18 12:00:00
1 2014-04-18 11:30:00 2014-04-18 12:00:00
比如像上面这样的一组数据,如何去除他的重复时间段,获得ID=1消耗的总时间分数?
感谢大虾帮忙!!!
------解决方案--------------------
不好意思,有点忙,写了一个,有点复杂。。
如:id begintime endtime
1 2014-04-18 10:00:00 2014-04-18 10:50:00
1 2014-04-18 10:30:00 2014-04-18 11:00:00
1 2014-04-18 10:10:00 2014-04-18 12:30:00
1 2014-04-18 10:10:00 2014-04-18 12:30:00
1 2014-04-18 11:30:00 2014-04-18 12:00:00
1 2014-04-18 11:30:00 2014-04-18 12:00:00
比如像上面这样的一组数据,如何去除他的重复时间段,获得ID=1消耗的总时间分数?
感谢大虾帮忙!!!
------解决方案--------------------
不好意思,有点忙,写了一个,有点复杂。。
--> 测试数据[huang]
if object_id('[huang]') is not null drop table [huang]
go
create table [huang]([id] int,[begintime] datetime,[endtime] datetime)
insert [huang]
select 1,'2014-04-18 10:00:00','2014-04-18 10:50:00' union all
select 1,'2014-04-18 10:30:00','2014-04-18 11:00:00' union all
select 1,'2014-04-18 10:10:00','2014-04-18 12:30:00' union all
select 1,'2014-04-18 10:10:00','2014-04-18 12:30:00' union all
select 1,'2014-04-18 11:30:00','2014-04-18 12:00:00' union all
select 1,'2014-04-18 11:30:00','2014-04-18 12:00:00' union all
select 1,'2014-04-18 15:30:00','2014-04-18 16:00:00'
union all
select 2,'2014-04-18 15:30:00','2014-04-18 16:00:00'
UNION ALL
select 2,'2014-04-18 10:00:00','2014-04-18 10:50:00' union all
select 2,'2014-04-18 10:30:00','2014-04-18 11:00:00' union all
select 2,'2014-04-18 10:10:00','2014-04-18 12:30:00' union all
select 2,'2014-04-18 10:10:00','2014-04-18 12:30:00' union all
select 2,'2014-04-18 11:30:00','2014-04-18 12:00:00' union all
select 2,'2014-04-18 11:30:00','2014-04-18 12:00:00' union all
select 2,'2014-04-18 15:30:00','2014-04-18 16:00:00'
--------------生成数据--------------------------
;WITH cte AS (
select DISTINCT *from [huang]),
cte2 AS
(
SELECT * ,ROW_NUMBER()OVER(PARTITION BY id ORDER BY begintime)oid
FROM cte
)
--SELECT * FROM cte2
,cte3 AS
(
SELECT *
FROM cte2
WHERE oid=1
UNION ALL
SELECT a.id,CASE WHEN a.begintime BETWEEN b.begintime AND b.endtime THEN b.begintime ELSE a.begintime END begintime,
CASE WHEN a.endtime BETWEEN b.begintime AND b.endtime AND b.endtime > a.endtime THEN b.endtime ELSE a.endtime END endtime,a.oid
FROM cte2 a INNER JOIN cte3 b ON a.id=b.id AND a.oid=b.oid+1
) ,cte4 AS (
SELECT DISTINCT id,begintime,endtime
FROM cte3 )
SELECT id,SUM(DATEDIFF(minute,begintime,endtime ))[总分钟数]
FROM (
SELECT *,ROW_NUMBER()OVER(PARTITION BY id,begintime ORDER BY endtime DESC )oid
FROM cte4 )a
WHERE oid=1
GROUP BY id
----------------结果----------------------------
/*
id 总分钟数
----------- -----------
1 180
2 180
*/