【问题标题】:SQL query for searching the dates用于搜索日期的 SQL 查询
【发布时间】: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')

【问题讨论】:

  • 如果您可以提供所需输出的示例,这可能有助于我们了解您的要求。请编辑您的问题以包含此附加信息
  • 我已经给出了样本。希望理解。

标签: c# php mysql sql


【解决方案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 天)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-05
      • 2021-12-12
      • 2017-09-03
      • 1970-01-01
      • 2014-05-03
      • 1970-01-01
      相关资源
      最近更新 更多