2013-11-25 2 views
0

У меня есть приложение, в котором, когда человек входит в кабинет, ему приходится заходить в чат, и когда он покидает офис, ему приходится выполнять часы. Это система посещаемости.Диапазон дат Не между конкретной датой SQL Server

Теперь я хочу проверить использование SQL-запроса, отсутствующего в конкретную дату.

таблица выглядит следующим образом: -

Time SHeet table

Каким должен быть запрос, чтобы выбрать personid, который отсутствовал на определенную дату?

+0

Вы даже попробовать что-нибудь? попробуйте что-нибудь вернуться, когда у вас что-то есть, вот как работает этот сайт. – nrathaus

+0

. Вы должны уточнить определение «отсутствие». Простым случаем может быть то, что в течение определенного дня нет строк для этой персоны. Но вы можете определить отсутствие как «работа на работе менее X часов» и т. Д. –

+2

Неужели любой человек работает через полночь? Если да, то в какой день они считаются «настоящими». –

ответ

0
SELECT PERSONID 
FROM <PERSON INFORMATION TABLE> 
WHERE PERSONID NOT IN(SELECT PERSONID FROM <TIMING INFORMATION TABLE> WHERE INTIMESTAMP=<PARTICULAR DATE>) 
0

Вы в основном хотите выбрать каждого сотрудника из своего штатного стола, а затем исключить всех, кто вошел в систему в определенный день. Короче говоря, это создает список 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; 
Смежные вопросы