2014-02-05 215 views
0

我已經寫了這個查詢來顯示某個員工在特定日期(如果他來了)的總工作時間和加班時間。我希望如果某個特定日期的人的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 
+0

你已經有一個'CASE'語句,這裏有什麼問題? –

+0

問題是假期我應該提及00:00在時間段 – PreciseTech

+0

對不起,也許我只是需要更多的咖啡。我們怎麼知道這是假期? –

回答

1

如果您的問題僅僅依賴於知道什麼時候一個日期是工作日/度假/週末我會建議使用一個數據倉庫解決方案。創建一個包含所有假期/週末的表格並檢查它。

根據日曆以及您正在使用的其他日期,您可以使用許多腳本來爲您創建腳本,但最簡單的方法應該是在未來10年左右計算您的所有假日登陸時的情況。例如聖誕節總是在12月23日感恩節固定爲3周月我將創建一個表像這樣

CREATE TABLE Holiday 
(
HolidayID INT NOT NULL, --surrogate key, but you can just as easily make HolidayDate the Natural key 
HolidayDate DATE NOT NULL 
HolidayName NVARCHAR(30),--encase you need non English holiday names saved 
... 
... 
.. 


INSERT INTO Holiday (HolidayDate,HolidayName) VALUES (2014-12-23, 'Christmas') 
INSERT INTO Holiday (HolidayDate,HolidayName) VALUES (2015-12-23, 'Christmas') 
INSERT INTO Holiday (HolidayDate,HolidayName) VALUES (2016-12-23, 'Christmas') 
INSERT INTO Holiday (HolidayDate,HolidayName) VALUES (2017-12-23, 'Christmas') 
..... 
..... 
.... 

或者,如果你想獲得更深入的你可以映射出以往天未來10年在表格中(日期維度表格)。然後將那些日子標記爲節假日,取消工作,銷售季度,以及沒有。 (谷歌日期維度表)

+0

先生,我怎麼不明白這個 – PreciseTech

+0

什麼讓你感到困惑,什麼時候可以一步一步地過去,如果你想 – gh9