用于搜索日期的 SQL 查询
Posted
技术标签:
【中文标题】用于搜索日期的 SQL 查询【英文标题】:SQL query for searching the dates 【发布时间】:2014-08-21 21:38:25 【问题描述】:我编写了一个 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】:通常要检查是否存在记录(就像您在这里为出勤所做的那样,检查员工一天没有签入/签出),使用 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
【讨论】:
【参考方案2】:您似乎捕获了员工在“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 日缺席,因此此处捕获了 6 月的总共 29 天)
然后,从另一个中减去一个,您将得到员工缺勤的日期。
【讨论】:
以上是关于用于搜索日期的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章