查询日期的SQL查询

本文关键字:查询 SQL 日期 | 更新日期: 2023-09-27 18:11:09

我编写了一个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')

查询日期的SQL查询

通常要检查记录是否存在(就像您在这里为考勤所做的那样,检查员工在某一天没有签到/签到),使用LEFT OUTER JOIN并检查WHERE子句中某个字段中的NULL(即,没有找到行的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

似乎您在'empCheckInOut'表中捕获了员工出现的天数。

您需要构建包含所有日期的临时表,例如1个月,然后减去'empCheckInOut'表中捕获的日期。

。#temp将有06-01-2014,06-02-2014,06-03-2014,…(6月全部30天)

CheckInOut将有06-01-2014,06-03-2014,…(emp在6月2日缺席,所以这里总共捕获了29天的6月)

然后,将其中一个减去另一个,您将得到员工缺席的日期。