首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

myselfff>跟<哥眼神纯洁不>老大进

2013-06-19 
myselfff和哥眼神纯洁不老大进本帖最后由 XinJW 于 2013-06-13 07:45:11 编辑SELECT WorkID, MIN(atd_d

myselfff>和<哥眼神纯洁不>老大进
本帖最后由 XinJW 于 2013-06-13 07:45:11 编辑

SELECT WorkID, MIN(atd_datetime) atd_datetime, '上班' type, CASE WHEN datepart(hh, 
      MIN(atd_datetime)) > 8 THEN '迟到' ELSE '正常' END AS remark, 
      Employee_Name
FROM (SELECT workid, CONVERT(datetime, atd_datetime) atd_datetime
        FROM Attendance
        WHERE Year(Atd_Datetime) = '2013' AND Month(Atd_Datetime) = '6') A JOIN
      Employee aa ON workid = aa.sn
GROUP BY WorkID, CONVERT(varchar, atd_datetime, 23), Employee_Name
HAVING datepart(hh, MIN(atd_datetime)) < 12
UNION ALL
SELECT WorkID, MAX(atd_datetime) atd_datetime, '下班' type, 
      CASE WHEN CONVERT(varchar(12), MAX(atd_datetime), 108) 
      > '17:30:00' THEN '正常' ELSE '早退' END AS remark, Employee_Name
FROM (SELECT workid, CONVERT(datetime, atd_datetime) atd_datetime
        FROM Attendance
        WHERE Year(Atd_Datetime) = '2013' AND Month(Atd_Datetime) = '6') A JOIN
      Employee aa ON workid = aa.sn
GROUP BY WorkID, CONVERT(varchar, atd_datetime, 23), Employee_Name
HAVING datepart(hh, MAX(atd_datetime)) > 12
ORDER BY WorkID, atd_datetime DESC


得出的结果

10022013/6/2 18:12:00下班正常延燕
10022013/6/2 7:53:00上班正常延燕
10022013/6/1 18:03:00下班正常延燕


10052013/6/11 7:51:00上班正常柳方杨
10062013/6/11 18:11:00下班正常陈昭晴
10062013/6/11 7:52:00上班正常陈昭晴
10062013/6/10 18:08:00下班正常陈昭晴
10062013/6/10 7:45:00上班正常陈昭晴
10062013/6/9 18:19:00下班正常陈昭晴

我想要得出如下结果怎么得出

得出的结果

10022013/6/2 18:12:00下班正常延燕
10022013/6/2 7:53:00上班正常延燕
10022013/6/1 18:03:00下班正常延燕
10022013/6/1        上班未打卡延燕
10052013/6/11       下班未打卡柳方杨
10052013/6/11 7:51:00上班正常柳方杨
10062013/6/11 18:11:00下班正常陈昭晴
10062013/6/11 7:52:00上班正常陈昭晴
10062013/6/10 18:08:00下班正常陈昭晴
10062013/6/10 7:45:00上班正常陈昭晴
10062013/6/9 18:19:00下班正常陈昭晴

就是如果这一天没有记录则添加一个空记录,比如忘记打卡,或休班,请假的时候也没有打卡,这些时候都要添加一个空记录。但是前提是where条件是本月的话,注意最大时间是今天下午的18:00以前。。谢谢
[解决办法]
下面的代码只是个示例,大概就是你的意思.
如果要通用,要做一些修改,原理就是这样.

select d.sn WorkID,d.atd_date+' '
+case when d.type='上班' then convert(varchar(8),ISNULL(e.atd_datetime,'08:00:00'),108)


  when d.type='下班' then convert(varchar(8),ISNULL(e.atd_datetime,'17:30:00'),108) else '' end Atd_Datetime,
d.type,isnull(e.remark,'未刷卡') remark,d.Employee_Name 
from ( select  sn,'2013-06-'+right('0'+CAST(number as varchar(2)),2) atd_date,type,Employee_Name
from ( select 
number from master..spt_values WHERE type ='P'and number between 1 and 30 ) as a, 
(select N'上班' [type]  union all select N'下班') as b,employee as c) as d left join 
(SELECT WorkID, MIN(atd_datetime) atd_datetime, '上班' type, 
CASE WHEN datepart(hh,       MIN(atd_datetime)) > 8 THEN '迟到' ELSE '正常' END AS remark, 
Employee_Name
FROM (SELECT workid, CONVERT(datetime, atd_datetime) atd_datetime        
FROM Attendance        WHERE Year(Atd_Datetime) = '2013' AND Month(Atd_Datetime) = '6') A 
JOIN      Employee aa ON workid = aa.sn 
GROUP BY WorkID, CONVERT(varchar, atd_datetime, 23), Employee_Name 
HAVING datepart(hh, MIN(atd_datetime)) < 12 
UNION ALL
SELECT WorkID, MAX(atd_datetime) atd_datetime, 
'下班' type,      
 CASE WHEN CONVERT(varchar(12), MAX(atd_datetime), 108)       > '17:30:00' 
 THEN '正常' ELSE '早退' END AS remark, Employee_Name FROM 
 (SELECT workid, CONVERT(datetime, atd_datetime) atd_datetime        FROM 
 Attendance        WHERE Year(Atd_Datetime) = '2013' AND Month(Atd_Datetime) = '6') A JOIN  
 Employee aa ON workid = aa.sn
 GROUP BY WorkID, CONVERT(varchar, atd_datetime, 23), 
 Employee_Name HAVING datepart(hh, MAX(atd_datetime)) > 12 ) as e 
 on d.sn=e.WorkID and d.type=e.type and day(atd_date)=day(e.Atd_Datetime)

热点排行