簡體   English   中英

用於搜索日期的SQL查詢

[英]SQL query for searching the dates

我編寫了一個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')

您似乎在'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天)

然后,從另一個中減去一個,您將獲得員工缺席的日期。

通常要檢查記錄是否存在(正如你在這里注意的那樣,檢查員工沒有在一天檢入/退出),使用LEFT OUTER JOIN和檢查NULL是否更有效率WHERE子句中的字段(即,沒有找到行的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM