搜索日期的SQL查询

4
我已经编写了一条SQL查询语句,用于查找缺勤的员工。但是我如何显示日期,也就是缺勤期间的日期?它可以正常运行,除了日期。我想显示缺勤期间的具体日期,但是无法显示。
样例:
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')

1
如果您能提供所需输出的示例,那么这可能有助于我们理解您的要求。请编辑您的问题以包含此附加信息。 - musefan
我已经提供了示例。希望能理解。 - TechView
2个回答

0
通常,为了检查记录的缺失(就像在这里检查出勤情况一样,检查员工某天是否签到/签退),更有效的方法是使用LEFT OUTER JOIN,并在WHERE子句中的一个字段中检查NULL(即没有找到行的LEFT JOIN)。
但是这也无法给你日期。
我假设您想要检查一系列日期,并且需要提取他们缺席的日期。
因此,可以使用一系列联合简单查询来获取日期,将其与员工表进行CROSS JOIN,然后将其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

0

看起来你已经在'empCheckInOut'表中记录了员工出勤的日期。

你需要构建一个临时表,包含一个月内所有的日期,然后减去在'empCheckInOut'表中记录的日期。

例如,#temp将包含06-01-2014、06-02-2014、06-03-2014等(6月的所有30天)

CheckInOut将包含06-01-2014、06-03-2014等(员工在6月2日缺席,因此这里记录了6月的29天)

然后,将一个减去另一个,就可以得到员工缺席的日期。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接