我已經寫了這個查詢來顯示特定日期(如果他來了)某個員工的總工作時間和加班。我希望如果某個特定日期的人的INtime和OutTime是空的,則在他的銀泰,外出時間,總工作時間,加班時間等00:00放置。星期天顯然沒有InTime和OutTime,那麼它應該在時間列中顯示00:00。注意:只有在提及人員InTIme的情況下才會輸入日期,否則將不會輸入DateVisited。計算來自其他列的數據
例如
EmplID EmplName ShiftID intime Outtime totalworking overtime dateVisited
0000001 John S001 00:00 00:00 00:00: 00:00 2013-12-01
查詢:
WITH times
AS (SELECT t1.EmplID
,t3.EmplName
,MIN(t1.RecTime) AS InTime
,MAX(t2.RecTime) AS [TimeOut]
,t4.ShiftId AS ShiftID
,t4.StAtdTime AS ShStartTime
,t4.EndAtdTime AS ShEndTime
,CAST(MIN(t1.RecTime) AS DATETIME) AS InTimeSub
,CAST(MAX(t2.RecTime) AS DATETIME) AS TimeOutSub
,t1.RecDate AS [DateVisited]
FROM AtdRecord t1
INNER JOIN AtdRecord t2
ON t1.EmplID = t2.EmplID
AND t1.RecDate = t2.RecDate
AND t1.RecTime < t2.RecTime
INNER JOIN HrEmployee t3
ON t3.EmplID = t1.EmplID
INNER JOIN AtdShiftSect t4
ON t3.ShiftId = t4.ShiftId
GROUP BY t1.EmplID
,t3.EmplName
,t1.RecDate
,t4.ShiftId
,t4.StAtdTime
,t4.EndAtdTime)
SELECT EmplID
,EmplName
,ShiftId AS ShiftID
,InTime
,[TimeOut]
,CONVERT(CHAR(5), CAST([TimeOutSub] - InTimeSub AS TIME), 108) TotalWorkingTime
,[DateVisited]
,CASE WHEN [InTime] IS NOT NULL
AND [TimeOut] IS NOT NULL
THEN CONVERT(CHAR(5), CASE WHEN CAST([TimeOutSub] AS DATETIME) >= ShEndTime
AND ShiftID = 'S002'
THEN LEFT(CONVERT(VARCHAR(12), DATEADD(ms,
DATEDIFF(ms,
CAST(ShEndTime AS DATETIME),
CAST([TimeOutSub] AS DATETIME)),
0), 108), 5)
WHEN CAST([TimeOutSub] AS DATETIME) >= ShEndTime
AND ShiftID = 'S001'
THEN LEFT(CONVERT(VARCHAR(12), DATEADD(ms,
DATEDIFF(ms,
CAST(ShEndTime AS DATETIME),
CAST([TimeOutSub] AS DATETIME)),
0), 108), 5)
ELSE '00:00'
END, 108)
ELSE 'ABSENT'
END AS OverTime
FROM times
ORDER BY EmplID
,ShiftID
,DateVisited
你能澄清你的問題嗎?我不確定你在問什麼。 – 2014-02-05 19:45:29
例如你是一名僱員,並且不會在那個日期前來一個星期日或任何假期,你的Id和Mae等應該出現,但時間應該是00:00,意味着當天沒有數據。 – PreciseTech
日期onlt gt僅在提到person時才被提及。實際上,我是從生物學的角度來看它的。 INTIME然後datevisited是飼養,但問題是,如果人是缺席,沒有InTime和沒有日期參觀,所以如何確定 – PreciseTech