2013-11-25 168 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;