2014-07-01 91 views
4

我已經編寫了一個SQL查詢,用於搜索缺席者的員工出席表。但我怎麼能顯示日期我的意思是缺席期的日期?除日期以外,它工作正常。我想說明那個缺席的那一天是怎麼回事?我無法顯示日期。用於搜索日期的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

如果你能提供你想要的輸出的例子,它可以幫助我們理解你的需求。請編輯您的問題以包含此附加信息 – musefan

+0

我已經提供了示例。希望理解。 – TechView

回答

0

通常爲了檢查記錄是否存在(因爲您正在這裏進行記錄,檢查員工沒有在一天中籤入/簽出),使用LEFT OUTER JOIN和檢查在WHERE子句中的一個字段中爲NULL(即,沒有找到任何行的LEFT JOIN)。

但是,這也不會給你的日期。

我認爲你想檢查日期的選擇,這需要通過他們缺席的日期。

因此,可能會使用一系列的聯合簡單查詢來獲取日期,CROSS 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 
0

看來你捕捉日內員工出現在 'empCheckInOut' 表。

您需要構建臨時表,其中所有日期可以說是1個月,然後減去在'empCheckInOut'表中捕獲的日期。

例如#temp將有06-01-2014,06-02-2014,06-03-2014,...(全部30天的Jun)

CheckInOut將有06-01-2014,06-03-2014 ,...(emp在6月2日不在,所以Jun在這裏總共29天被捕獲)

然後,從另一個減去一個,你會得到僱員缺席的日期。