2014-02-05 242 views
-1

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

你能澄清你的問題嗎?我不確定你在問什麼。 – 2014-02-05 19:45:29

+0

例如你是一名僱員,並且不會在那個日期前來一個星期日或任何假期,你的Id和Mae等應該出現,但時間應該是00:00,意味着當天沒有數據。 – PreciseTech

+0

日期onlt gt僅在提到person時才被提及。實際上,我是從生物學的角度來看它的。 INTIME然後datevisited是飼養,但問題是,如果人是缺席,沒有InTime和沒有日期參觀,所以如何確定 – PreciseTech

回答

0

對於你的情況,要做到這一點,最好的方法是創建一個表,會給你分鐘,分數計算。

例如:1分鐘= 0.02小時40分鐘=0.67小時

這之後,您可以與您的查詢,這將有助於您聯繫。

0

這可以讓你聽起來像你所要求的。我確信有可能有更好的解決方案,但是這是我做的一個方法。這其中大部分是我創建臨時表的工作。從星號往下是查詢工作。

--created a table filled with the dates of every day between now and the 14th. 
DECLARE @days datetime 
SET @days = GETDATE() 
CREATE TABLE #daylist (
dateofwork datetime) 
WHILE @days < '02/14/2014' 
    BEGIN 
    SELECT @days 
    INSERT INTO #daylist (dateofwork) 
    VALUES (@days) 
    SET @days = DATEADD(d, 1, @days) 
    END 

--created a table of employees with work dates and times 
CREATE TABLE #emps (
ID varchar(10), 
timein varchar(10), 
timedone varchar(10), 
dateofwork datetime 
) 
--inserted values for that table 
INSERT INTO #emps (ID, timein, timedone, dateofwork) 
VALUES ('123', '08:00', '17:00', '02/12/2014'), 
    ('789', '07:00', '18:00', '02/11/2014') 

--******************************************************** 
--used this to get each employee matched with every date showing 
--00:00 on all the days they didn't work 
SELECT CONVERT(varchar,d.dateofwork,101) AS dateofwork, 
t.ID, 
ISNULL(timein, '00:00') AS timein, 
ISNULL(timedone, '00:00') AS timedone 
FROM #daylist d 
    INNER JOIN (SELECT e.ID, d.dateofwork 
       FROM #emps e, #daylist d) AS t ON CONVERT(varchar,d.dateofwork,101) =  CONVERT(varchar,t.dateofwork,101) 
    LEFT JOIN #emps e ON CONVERT(varchar,e.dateofwork,101) =  CONVERT(varchar,t.dateofwork,101) 
      AND e.ID = t.id 
ORDER BY dateofwork 
相關問題