请大家帮我想想下面的这个怎么处理
原始表
设备名称 开机时间 关机时间
设备1 2013-11-01 9:00:00 2013-11-02 15:00:00
设备2 2013-11-02 18:00:00 2013-11-04 10:00:00
期望得到的结果是
设备名称 日 历时
设备1 2013-11-01 15
设备1 2013-11-02 15
设备2 2013-11-02 6
设备2 2013-11-03 24
设备2 2013-11-04 10
历时的单位是小时,也就是要统计出每个设备每一天的所有运行时间累加起来
时间段 按天累计历时
------解决方案--------------------
create table dot
(设备名称 varchar(10),开机时间 datetime,关机时间 datetime)
insert into dot
select '设备1','2013-11-01 9:00:00','2013-11-02 15:00:00' union all
select '设备2','2013-11-02 18:00:00','2013-11-04 10:00:00'
with t as
(select a.设备名称,a.开机时间,a.关机时间,
convert(varchar,dateadd(d,b.number,convert(varchar,a.开机时间,23)),23) '日'
from (select 设备名称,开机时间,关机时间,datediff(d,开机时间,关机时间) 'dd'
from dot) a
cross apply (select number from master.dbo.spt_values
where type='P' and number<=a.dd) b
)
select 设备名称,日,
case when datediff(d,开机时间,日)=0 then 24-datepart(hh,开机时间)
when datediff(d,关机时间,日)=0 then datepart(hh,关机时间)
else 24 end '历时'
from t
/*
设备名称 日 历时
---------- ------------------------------ -----------
设备1 2013-11-01 15
设备1 2013-11-02 15
设备2 2013-11-02 6
设备2 2013-11-03 24
设备2 2013-11-04 10
(5 row(s) affected)
*/
------解决方案--------------------
create table
#tb(设备名称 nvarchar(10), 开机时间 datetime,关机时间 datetime)
insert into #tb
select N'设备1' ,'2013-11-01 9:00:00' ,'2013-11-02 15:00:00'union
select N'设备2' ,'2013-11-02 18:00:00','2013-11-04 10:00:00'union
select * from #tb
;WITH CTE AS
(
SELECT [设备名称],[开机时间] ,
case when CONVERT(varchar(12) , [开机时间], 112 )=CONVERT(varchar(12) , [关机时间], 112 ) then [关机时间]
else CAST ( CONVERT(varchar(12) , dateadd(dd,1,开机时间), 111 )+' 00:00:00' as datetime) end as '日期',