日期:2014-05-18  浏览次数:20566 次

考勤统计的问题
表:
部门       员工名       打卡时间                             班次  
a             张三           2007-1-15   9:20                 1
a             张三           2007-1-15   18:30                 2
a             李四           2007-1-15   8:00                 1
a             李四           2007-1-15   18:10                 2
b             赵五           2007-1-15   8:00                 1
b             赵五           2007-1-15   8:00                 2
……
需要得到每月份的统计:
部门       员工名       上班时间                     下班时间                     时长      
  a             张三           2007-1-15   9:20     2007-1-15   18:30     9:10
  a             李四           2007-1-15   8:20     2007-1-15   18:10     8:50
……

------解决方案--------------------
create table #(部门 varchar(10), 员工名 varchar(10), 打卡时间 datetime, 班次 int)
insert into # select 'a ' , '张三 ' , '2007-1-15 9:20 ' , 1
union all select 'a ' , '张三 ', '2007-1-15 18:30 ' , 2
union all select 'a ' , '李四 ', '2007-1-15 8:00 ' , 1
union all select 'a ' , '李四 ' , '2007-1-15 18:10 ' , 2
union all select 'b ' , '赵五 ' , '2007-1-15 8:00 ' , 1
union all select 'b ' , '赵五 ' , '2007-1-15 8:00 ' , 2

select 部门,员工名,上班时间=max(case when 班次=1 then 打卡时间 end),下班时间=max(case when 班次=2 then 打卡时间 end),时长=cast(datediff(hour,max(case when 班次=1 then 打卡时间 end),max(case when 班次=2 then 打卡时间 end)) as varchar)+ ': '+cast(datediff(minute,max(case when 班次=1 then 打卡时间 end),max(case when 班次=2 then 打卡时间 end)) % 60 as varchar) from # group by 部门,员工名

--
a 李四 2007-01-15 08:00:00.000 2007-01-15 18:10:00.000 10:10
a 张三 2007-01-15 09:20:00.000 2007-01-15 18:30:00.000 9:10
b 赵五 2007-01-15 08:00:00.000 2007-01-15 08:00:00.000 0:0