Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于计算工时的SQL查询_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

用于计算工时的SQL查询

用于计算工时的SQL查询,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我创建了一个查询,它在一个时钟输入/输出系统上收集人们的时间,并将他们安排到正确的日期,因为这是近班次,所以跨越两天,这里是查询和输出 SELECT china_vision_pubpersonnel.NAME, china_vision_pubpersonnel.id, china_vision_pubcards.cardcode, china_vision_pubpersonnel.telephone, atdshiftdetail.endo

我创建了一个查询,它在一个时钟输入/输出系统上收集人们的时间,并将他们安排到正确的日期,因为这是近班次,所以跨越两天,这里是查询和输出

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是输入的时间

Day是输入的日期

Day number是一个天数列表,输入到一个数字中,因为您可以在每个相同的日子都有相同的数字

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
所以最终的目标应该是把印第1-2天加起来,3-4天加起来,然后这两个结果得到当天的总数


这一天就是Inday 1登陆的那一天,这里有一个数据和临时表的例子。这应该让你开始。显然,你的结果需要一些努力

    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

下面是一个数据表和临时表的示例。这应该让你开始。显然,你的结果需要一些努力

    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

你在这里总结什么?一班工作的总小时数?要保留当前查询,您需要再添加两个抽象级别,一个级别用于获取按员工、日期和InDay计算分组的值的总和,另一个级别用于按员工和日期进行总和。确切地说,对于Daynumber 42773,这将是InDay 1和2之间的差值,然后是第3-4天和这两个结果的总时间之差假设你只想通过sql server得到这个查询的结果,将这个查询的结果插入一个临时表,然后按照Ross说的做。谢谢大家的回复,我对sql不是很在行你有什么例子可以看吗?或者,我可以通过“选择”你的查询“阅读”到“a”#诱惑”。或者先创建一个临时表,然后您可以查询#tentable并对所需字段进行分组。您在这里求和是什么?一班工作的总小时数?要保留当前查询,您需要再添加两个抽象级别,一个级别用于获取按员工、日期和InDay计算分组的值的总和,另一个级别用于按员工和日期进行总和。确切地说,对于Daynumber 42773,这将是InDay 1和2之间的差值,然后是第3-4天和这两个结果的总时间之差假设你只想通过sql server得到这个查询的结果,将这个查询的结果插入一个临时表,然后按照Ross说的做。谢谢大家的回复,我对sql不是很在行你有什么例子可以看吗?或者,我可以通过“选择”你的查询“阅读”到“a”#诱惑”。或者先创建一个临时表,然后就可以查询#tentable并对所需字段进行分组。