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
得出的结果
1002 2013/6/2 18:12:00 下班 正常 延燕
1002 2013/6/2 7:53:00 上班 正常 延燕
1002 2013/6/1 18:03:00 下班 正常 延燕
1005 2013/6/11 7:51:00 上班 正常 柳方杨
1006 2013/6/11 18:11:00 下班 正常 陈昭晴
1006 2013/6/11 7:52:00 上班 正常 陈昭晴
1006 2013/6/10 18:08:00 下班 正常 陈昭晴
1006 2013/6/10 7:45:00 上班 正常 陈昭晴
1006 2013/6/9 18:19:00 下班 正常 陈昭晴
我想要得出如下结果怎么得出
得出的结果
1002 2013/6/2 18:12:00 下班 正常 延燕
1002 2013/6/2 7:53:00 上班 正常 延燕
1002 2013/6/1 18:03:00 下班 正常 延燕
1002 2013/6/1 上班 未打卡 延燕
1005 2013/6/11 下班 未打卡 柳方杨
1005 2013/6/11 7:51:00 上班 正常 柳方杨
1006 2013/6/11 18:11:00 下班 正常 陈昭晴
1006 2013/6/11 7:52:00 上班 正常 陈昭晴
1006 2013/6/10 18:08:00 下班 正常 陈昭晴
1006 2013/6/10 7:45:00 上班 正常 陈昭晴
1006 2013/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)