2014-07-01 2 views
4

결석하는 직원 ATTENDANCE 테이블을 검색하는 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).

그러나 이것 역시 날짜를 알려주지 않습니다.

내가 선택한 날짜를 확인하려고하고 있는데,이 날짜는 결석 일을 거쳐야합니다.

날짜를 얻기 위해 일련의 unioned 간단한 쿼리를 사용하고, 직원 테이블에 CROSS JOIN을 지정하고 empCheckInOut 테이블에 LEFT JOIN합니다. 이렇게하면 데이트 할 수 있습니다.

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'테이블에 존재 캡처 할 것으로 보인다.

'empCheckInOut'테이블에 캡처 된 날짜와 1 개월을 말한 모든 날짜로 임시 테이블을 구성해야합니다.

#temp는 06-01-2014, 06-02-2014, 06-03-2014, ... (전체 30 일 중)

CheckInOut은 06-01-2014, 06-03-2014를 갖습니다. , ... (6 월 2 일에 EMP가 부재하므로 총 29 일간 여기에서 캡처 됨)

그런 다음 다른 직원을 빼고 직원이 부재중인 날짜를 얻습니다.

관련 문제