用于搜索日期的 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 查询的主要内容,如果未能解决你的问题,请参考以下文章

用于检查房间可用性的 SQL 查询

如何使用 sql 查询使用注册日期列搜索网格视图

用于显示多个日期范围之间的间隔的 SQL 查询

使用sql语句查询日期的方法

DATEDIFF() 或 BETWEEN 用于 SQL 查询中的日期范围

用于在同一用户的单行中显示重复日期的SQL查询