2017-02-10 84 views
1

我创建了一个查询,用于在时钟输入/输出系统中收集用户时间,并将它们指定到正确的一天,因为这些都是近距离移动,所以跨越两天,这里是查询和输出把这个查询的大部分列名的用于计算工作时间的SQL查询

SELECT 
    china_vision_pubpersonnel.NAME, 
    china_vision_pubpersonnel.id, 
    china_vision_pubcards.cardcode, 
    china_vision_pubpersonnel.telephone, 
    atdshiftdetail.endoverday, 
    china_vision_dorevents.eventtm AS T, 
    CONVERT(VARCHAR(10), china_vision_dorevents.eventtm, 103) AS Day, 
    Floor(CONVERT(FLOAT, Dateadd(hour, 4, eventtm))) AS DayNumber, 
    Row_number() OVER(PARTITION BY Floor(CONVERT(FLOAT, Floor(CONVERT(FLOAT, Dateadd(hour, 6, eventtm))))) 
         ORDER BY Floor(CONVERT(FLOAT, Dateadd(hour, 5, eventtm)))) InDay 
FROM 
    china_vision_pubcards 
INNER JOIN 
    china_vision_pubpersonnel ON china_vision_pubcards.pubpersonnel_ref = china_vision_pubpersonnel.reference 
INNER JOIN 
    china_vision_dorevents ON china_vision_pubcards.cardcode = china_vision_dorevents.cardcode 
INNER JOIN 
    atdshiftdetail ON RIGHT(china_vision_pubpersonnel.id, 4) = atdshiftdetail.NAME 
WHERE 
    (china_vision_dorevents.dorctrls_ref = '16') 
    AND (CONVERT(DATE, china_vision_dorevents.eventtm) > Dateadd(day, -730, Getdate())) 
    AND atdshiftdetail.endoverday = '1' 

结果不言自明然而

T是输入的时间

日是输入当天

天数是一个天数列表,因为你可以每天每天都是相同的数字

InDay是投入的顺序,所以你可以看到1总是在晚上2和3一起去,并从制动回来,和4离开

Name | ID | CardCode | Telephone | EndOverDay |   T (Time)  | Day  | DayNumber | InDay 
    ------------------------------------------------------------------------------------------------------------------ 
    Name | ID | CardCode | 9  | 1  | 2017-02-10 07:52:00.000 | 10/02/2017 | 42774 | 4 
    Name | ID | CardCode | 9  | 1  | 2017-02-10 03:28:31.000 | 10/02/2017 | 42774 | 3 
    Name | ID | CardCode | 9  | 1  | 2017-02-10 02:57:14.000 | 10/02/2017 | 42774 | 2 
    Name | ID | CardCode | 9  | 1  | 2017-02-09 19:18:19.000 | 09/02/2017 | 42773 | 1 
    Name | ID | CardCode | 9  | 1  | 2017-02-09 07:50:55.000 | 09/02/2017 | 42773 | 4 
    Name | ID | CardCode | 9  | 1  | 2017-02-09 03:28:41.000 | 09/02/2017 | 42773 | 3 
    Name | ID | CardCode | 9  | 1  | 2017-02-09 02:56:14.000 | 09/02/2017 | 42773 | 2 
    Name | ID | CardCode | 9  | 1  | 2017-02-08 19:19:05.000 | 08/02/2017 | 42772 | 1 
    Name | ID | CardCode | 9  | 1  | 2017-02-08 07:43:06.000 | 08/02/2017 | 42772 | 4 
    Name | ID | CardCode | 9  | 1  | 2017-02-08 03:26:33.000 | 08/02/2017 | 42772 | 3 
    Name | ID | CardCode | 9  | 1  | 2017-02-08 02:54:58.000 | 08/02/2017 | 42772 | 2 
    Name | ID | CardCode | 9  | 1  | 2017-02-07 19:15:46.000 | 07/02/2017 | 42771 | 1 

所以最终目标应该是一起加入Indays 1-2,3-4,然后这两个结果得到的总当天

当天是Inday 1登陆的那一天

+0

你在这里总结什么?一个班次的总小时数?要保留当前的查询,您需要添加两个抽象层次,一个获取按员工,日期和InDay计算分组的值的总和,另一个按员工和日期进行总和。 –

+0

的确如此,对于Daynumber 42773,它将是InDay 1和2之间的差异,然后将InDay 3-4与这两个结果之间的差异合并为总时间 –

+0

假设您只是想通过sql server查询结果,将这个查询的结果插入一个临时表,并按照Ross的说法。 – manderson

回答

0

以下是您的数据和临时表的示例。这应该让你开始。很明显,你的结果需要一些工作。

CREATE TABLE #TempTable ( 
          EmpName   VARCHAR(10) 
          , ID   INT 
          , CardCode  VARCHAR(10) 
          , Telephone  VARCHAR(10) 
          , EndOverDay int 
          , T    DATETIME 
          , TDay   DATETIME 
          , DayNumber  BIGINT 
          , InDay   INT 
         ) 

INSERT INTO #TempTable 
VALUES ('Rick Flair', 1, 'CardCode', 9, 1, '2017-02-10 07:52:00.000', '10/02/2017', 42774, 4) 
INSERT INTO #TempTable 
VALUES ('Rick Flair', 1, 'CardCode', 9, 1, '2017-02-10 03:28:31.000', '10/02/2017', 42774, 3) 
INSERT INTO #TempTable 
VALUES ('Rick Flair', 1, 'CardCode', 9, 1, '2017-02-10 02:57:14.000', '10/02/2017', 42774, 2) 
INSERT INTO #TempTable 
VALUES ('Rick Flair', 1, 'CardCode', 9, 1, '2017-02-09 19:18:19.000', '09/02/2017', 42773, 1) 
INSERT INTO #TempTable 
VALUES ('Scott Hall', 2, 'CardCode', 9, 1, '2017-02-09 07:50:55.000', '09/02/2017', 42773, 4) 
INSERT INTO #TempTable 
VALUES ('Scott Hall', 2, 'CardCode', 9, 1, '2017-02-09 03:28:41.000', '09/02/2017', 42773, 3) 
INSERT INTO #TempTable 
VALUES ('Scott Hall', 2, 'CardCode', 9, 1, '2017-02-09 02:56:14.000', '09/02/2017', 42773, 2) 
INSERT INTO #TempTable 
VALUES ('Scott Hall', 2, 'CardCode', 9, 1, '2017-02-08 19:19:05.000', '08/02/2017', 42772, 1) 
INSERT INTO #TempTable 
VALUES ('Kevin Nash', 3, 'CardCode', 9, 1, '2017-02-08 07:43:06.000', '08/02/2017', 42772, 4) 
INSERT INTO #TempTable 
VALUES ('Kevin Nash', 3, 'CardCode', 9, 1, '2017-02-08 03:26:33.000', '08/02/2017', 42772, 3) 
INSERT INTO #TempTable 
VALUES ('Kevin Nash', 3, 'CardCode', 9, 1, '2017-02-08 02:54:58.000', '08/02/2017', 42772, 2) 
INSERT INTO #TempTable 
VALUES ('Kevin Nash', 3, 'CardCode', 9, 1, '2017-02-07 19:15:46.000', '07/02/2017', 42771, 1) 


SELECT A.EmpName, SUM(A.HoursWorked) AS HoursWorked 
FROM (
     SELECT t1.EmpName, t1.id, t1.t AS Time1, t2.t AS Time2, datediff(HOUR, t1.t, t2.t) AS HoursWorked 
     FROM #TempTable t1 
      JOIN (
        SELECT EmpName , 
          ID , 
          CardCode , 
          Telephone , 
          EndOverDay , 
          T , 
          TDay , 
          DayNumber , 
          InDay 
        FROM #TempTable 
        WHERE InDay = 2 
       ) t2 ON 
       t1.id = t2.id 
     WHERE t1.InDay = 1 

     UNION all 

     SELECT t1.EmpName, t1.id, t1.t AS Time1, t2.t AS Time2, datediff(HOUR, t1.t, t2.t) AS HoursWorked 
     FROM #TempTable t1 
      JOIN (
        SELECT EmpName , 
          ID , 
          CardCode , 
          Telephone , 
          EndOverDay , 
          T , 
          TDay , 
          DayNumber , 
          InDay 
        FROM #TempTable 
        WHERE InDay = 4 
       ) t2 ON 
       t1.id = t2.id 
     WHERE t1.InDay = 3 
    ) A 
GROUP BY A.EmpName; 


DROP TABLE #TempTable