Вы в основном хотите выбрать каждого сотрудника из своего штатного стола, а затем исключить всех, кто вошел в систему в определенный день. Короче говоря, это создает список PersonID, который не отображается в данный день.
Это решение работает, в комплекте с примерами случаев:
CREATE TABLE #temp (TimeSheetLogId INT IDENTITY(1,1), InTimeStamp DATETIME, OutTimeStamp DATETIME, PersonID INT);
-- last week
-- PersonID=1, didnt come to work last monday
-- INSERT #temp VALUES ('2013-11-19 09:00:00.000','2013-11-19 17:00:00.000',1);
INSERT #temp VALUES ('2013-11-20 09:00:00.000','2013-11-20 17:00:00.000',1);
INSERT #temp VALUES ('2013-11-21 09:00:00.000','2013-11-21 17:00:00.000',1);
INSERT #temp VALUES ('2013-11-22 09:00:00.000','2013-11-22 17:00:00.000',1);
INSERT #temp VALUES ('2013-11-23 09:00:00.000','2013-11-23 17:00:00.000',1);
-- 9AM-5PM shift
INSERT #temp VALUES ('2013-11-19 09:00:00.000','2013-11-19 17:00:00.000',2);
INSERT #temp VALUES ('2013-11-20 09:00:00.000','2013-11-20 17:00:00.000',2);
INSERT #temp VALUES ('2013-11-21 09:00:00.000','2013-11-21 17:00:00.000',2);
INSERT #temp VALUES ('2013-11-22 09:00:00.000','2013-11-22 17:00:00.000',2);
INSERT #temp VALUES ('2013-11-23 09:00:00.000','2013-11-23 17:00:00.000',2);
-- 11PM-7AM shift
INSERT #temp VALUES ('2013-11-18 23:00:00.000','2013-11-19 07:00:00.000',3);
INSERT #temp VALUES ('2013-11-19 23:00:00.000','2013-11-20 07:00:00.000',3);
INSERT #temp VALUES ('2013-11-20 23:00:00.000','2013-11-21 07:00:00.000',3);
INSERT #temp VALUES ('2013-11-21 23:00:00.000','2013-11-22 07:00:00.000',3);
INSERT #temp VALUES ('2013-11-22 23:00:00.000','2013-11-23 07:00:00.000',3);
-- this week
INSERT #temp VALUES ('2013-11-25 09:00:00.000',NULL,1);
INSERT #temp VALUES ('2013-11-25 09:00:00.000',NULL,2);
INSERT #temp VALUES ('2013-11-24 23:00:00.000',NULL,3);
DECLARE @ExamineDate DATE = '2013-11-19'
-- You want to select DISTINCT PersonID from your main STAFF table that contains all records, I did this for simplicity!
SELECT DISTINCT(PersonID)
FROM #temp A
EXCEPT
-- this query should remain as-is
SELECT PersonID
FROM #temp A
WHERE
CAST(A.InTimeStamp AS DATE) = @ExamineDate
OR
CAST(A.OutTimeStamp AS DATE) = @ExamineDate
;
DROP TABLE #temp;
Вы даже попробовать что-нибудь? попробуйте что-нибудь вернуться, когда у вас что-то есть, вот как работает этот сайт. – nrathaus
. Вы должны уточнить определение «отсутствие». Простым случаем может быть то, что в течение определенного дня нет строк для этой персоны. Но вы можете определить отсутствие как «работа на работе менее X часов» и т. Д. –
Неужели любой человек работает через полночь? Если да, то в какой день они считаются «настоящими». –