简体   繁体   English

用于计算工时的SQL查询

[英]SQL query for calculating work hours

I have created a query that gathers people times on a clock in/out system, and orders them to the correct day as these are nigh shift, so span two days, here is the query and out put 我已经创建了一个查询,在时钟输入/输出系统中收集人们的时间,并命令他们到正确的一天,因为这些是近移,所以跨越两天,这里是查询和输出

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' 

Results of this query most of the column names are self explanatory However 此查询的结果大多数列名称都是自解释的但是

T is the Time of input T是输入时间

Day is the day of that input 日是投入的一天

Day number is a list of days put in to a number, as you can each each day that is the same has the same number 日期编号是输入到某个数字的天数列表,因为您可以每天使用相同的数字

InDay is the order of the inputs, so as you can see 1 is always at night 2 and 3 are going and coming back from brake, and 4 is leaving 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

So the End goal should be adding the Indays 1-2 together, 3-4 together and then those two results to get the total for that day 因此,最终目标应该是将Indays 1-2加在一起,共3-4个,然后将这两个结果添加到当天的总数中

The day is the day that Inday 1 lands on 这一天是Inday 1登陆的日子

Here is an example with your data and temp tables. 以下是您的数据和临时表的示例。 This should get you started. 这应该让你开始。 Obviously needs some work for your results. 显然需要为您的结果做一些工作。

    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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM