我编写了一个SQL查询,在查询员工ATTENDANCE表中查找缺席的人员。但是,我怎样才能显示我所说的缺席期的日期?除日期外它工作正常。我想表明那个缺席时期的那一天是什么时候?我无法显示日期。
示例:
BadgeNumber - EmployeeName - Absent Date
10042 - Mr. Erik - 2014-07-01
代码:
SELECT SMEmployee.BadgeNumber,SMEmployee.EmployeeFullName,SMDepartment.DepartmentName
FROM SMEmployee
LEFT OUTER JOIN SMDepartment
ON SMDepartment.DepartmentID=SMEmployee.DepartmentID
WHERE EmployeeID NOT IN (
SELECT empCheckInOut.USERID
FROM empCheckInOut
WHERE convert(date,CHECKTIME)='2014-07-01')
答案 0 :(得分:0)
您似乎抓住了员工在'empCheckInOut'中出现的日子。表
您需要构建临时表,其中所有日期都可以说是1个月,然后减去在' empCheckInOut'中捕获的日期。表
e.g。 #temp将于06-01-2014,06-02-2014,06-03-2014,...(6月的所有30天)
CheckInOut将于06-01-2014,06-03-2014,...(emp在6月2日缺席,因此在这里捕获的总共29天)
然后,从另一个中扣除一个,您将获得员工缺席的日期。
答案 1 :(得分:0)
通常要检查记录是否存在(正如您在此处所做的那样,请注意员工没有在一天内办理入住/退房),使用LEFT OUTER JOIN和检查是否更有效率WHERE子句中的一个字段中的NULL(即,没有找到行的LEFT JOIN)。
然而,这也不会给你日期。
我认为您要检查选择的日期,这需要了解它们缺席的日期。
因此可能会使用一系列联合简单查询来获取日期,将CROSS JOIN连接到您的employee表,并将LEFT JOIN连接到empCheckInOut表。这样你就可以把日期记下来了。
SELECT SMEmployee.BadgeNumber,SMEmployee.EmployeeFullName,SMDepartment.DepartmentName, subDate.aDate
FROM SMEmployee
CROSS JOIN (SELECT '2014-07-01' AS aDate UNION SELECT '2014-06-30') subDate
LEFT OUTER JOIN SMDepartment
ON SMDepartment.DepartmentID=SMEmployee.DepartmentID
LEFT OUTER JOIN empCheckInOut
ON SMEmployee.EmployeeID = empCheckInOut.USERID
AND convert(date,CHECKTIME) = subDate.aDate
WHERE empCheckInOut.USERID IS NULL