用于搜索日期的SQL查询

时间:2014-07-01 10:47:21

标签: c# php mysql sql

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

2 个答案:

答案 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