当前位置: 代码迷 >> Sql Server >> SQL server怎么将一段连续日期分两个字段显示
  详细解决方案

SQL server怎么将一段连续日期分两个字段显示

热度:8   发布时间:2016-04-24 09:54:11.0
SQL server如何将一段连续日期分两个字段显示
最近要写一些HR方面的报表,碰到了一个问题,请大神们帮忙看看

一)问题
DEPT  NAME   ID        DATE
0001    小陈   0035    2014-09-01
0001    小陈   0035    2014-09-02
0001    小陈   0035    2014-09-03
0001    小陈   0035    2014-09-04
0001    小陈   0035    2014-09-05
0001    小陈   0035    2014-09-06
0001    小陈   0035    2014-09-08
0001    小陈   0035    2014-09-09
0001    小陈   0035    2014-09-10
0001    小陈   0035    2014-09-11
0001    小陈   0035    2014-09-12
0001    小陈   0035    2014-09-16
0001    小陈   0035    2014-09-17

想让结果:
DEPT  NAME   ID        Begin               End
0001    小陈   0035    2014-09-01     2014-09-06
0001    小陈   0035    2014-09-08     2014-09-12
0001    小陈   0035    2014-09-16     2014-09-17

二)这是一个人打卡记录表,有时这个周末双休,有时这个人周末单体,有时这个人周末不休息,我想要的是一个连续的打卡日期 ,从开始日--->结束日

------解决思路----------------------

with  cte as 
(select '0001' as dept , '小陈'as name,0035 as id,'2014-09-01' as date union all
 select '0001' as dept , '小陈'as name,0035 as id,'2014-09-02' as date union all
 select '0001' as dept , '小陈'as name,0035 as id,'2014-09-03' as date union all
 select '0001' as dept , '小陈'as name,0035 as id,'2014-09-04' as date union all
 select '0001' as dept , '小陈'as name,0035 as id,'2014-09-05' as date union all
 select '0001' as dept , '小陈'as name,0035 as id,'2014-09-06' as date union all
 select '0001' as dept , '小陈'as name,0035 as id,'2014-09-08' as date union all
 select '0001' as dept , '小陈'as name,0035 as id,'2014-09-09' as date union all
 select '0001' as dept , '小陈'as name,0035 as id,'2014-09-10' as date union all
 select '0001' as dept , '小陈'as name,0035 as id,'2014-09-11' as date union all
 select '0001' as dept , '小陈'as name,0035 as id,'2014-09-12' as date union all
 select '0001' as dept , '小陈'as name,0035 as id,'2014-09-16' as date union all
 select '0001' as dept , '小陈'as name,0035 as id,'2014-09-17' as date  )
 select dept,name,id, Min(date) as begindate,MAX(date) as endtime
  from (select *,row_number()over(order by date) as n ,
    datediff(day,'2014-08-31',convert(date,[date]))as n1 from cte) as n
    group by dept,name,id,n1-n
    
--结果
dept name id          begindate  endtime
---- ---- ----------- ---------- ----------
0001 小陈   35          2014-09-01 2014-09-06
0001 小陈   35          2014-09-08 2014-09-12
0001 小陈   35          2014-09-16 2014-09-17

(3 行受影响)

这个是一样的啊。还比我这个例子简单了。
------解决思路----------------------

--借用上面老兄数据
;with  cte as 
(select '0001' as dept , '小陈'as name,0035 as id,'2014-09-01' as date union all
 select '0001' as dept , '小陈'as name,0035 as id,'2014-09-02' as date union all
 select '0001' as dept , '小陈'as name,0035 as id,'2014-09-03' as date union all
 select '0001' as dept , '小陈'as name,0035 as id,'2014-09-04' as date union all
 select '0001' as dept , '小陈'as name,0035 as id,'2014-09-05' as date union all
  相关解决方案