2014-07-01 4 views
4

J'ai écrit une requête SQL qui recherche dans la table ATTENDANCE des employés les personnes absentes. Mais comment puis-je montrer les dates que je veux dire la date de la période d'absence? Cela fonctionne bien sauf la date. Je veux montrer quel est le jour de cette période d'absence? Je suis incapable de montrer la date.Requête SQL pour la recherche des dates

Exemple:

BadgeNumber - EmployeeName - Absent Date 
10042 - Mr. Erik - 2014-07-01 

code:

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

Il pourrait nous aider à comprendre votre exigence si vous pouviez fournir un exemple de votre sortie désirée. S'il vous plaît modifier votre question pour inclure ces informations supplémentaires – musefan

+0

J'ai donné l'échantillon. Espérons comprendre. – TechView

Répondre

0

Normalement, pour vérifier le manque d'existence d'un enregistrement (comme vous le faites ici pour la présence, vérifier que l'employé n'a pas enregistré/retiré un jour), il est plus efficace d'utiliser une jointure gauche et la vérification pour NULL dans l'un des champs de la clause WHERE (c'est-à-dire un LEFT JOIN où aucune ligne n'a été trouvée).

Cependant, cela ne vous donnera pas non plus la date.

Je présume que vous voulez vérifier une sélection de dates, et ce besoin de tirer à travers la date où ils étaient absents. En tant que tel, vous pouvez utiliser une série de requêtes simples syndiquées pour obtenir les dates, CROSS JOIN cela à votre table des employés et LEFT le joindre à la table empCheckInOut. De cette façon, vous pouvez mettre la date.

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

Il semble que vous capturez l'employé de jours est présent dans le tableau 'empCheckInOut'.

Vous devez construire une table temporaire avec toutes les dates, disons 1 mois, puis moins les dates capturées dans la table 'empCheckInOut'.

par exemple. #temp aura 06-01-2014, 06-02-2014, 06-03-2014, ... (tous les 30 jours de juin)

CheckInOut aura 06-01-2014, 06-03-2014 , ... (emp est absent le 2 juin, donc total 29 jours de juin capturés ici)

Ensuite, soustrayez l'un de l'autre et vous obtiendrez des dates lorsque l'employé est absent.

Questions connexes