当前位置: 代码迷 >> Sql Server >> 处置时间段SQL
  详细解决方案

处置时间段SQL

热度:7   发布时间:2016-04-24 19:41:17.0
处理时间段SQL
请大家帮我想想下面的这个怎么处理
原始表
设备名称   开机时间                        关机时间
设备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 '日期',
  相关解决方案