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登陆的那一天
你在这里总结什么?一个班次的总小时数?要保留当前的查询,您需要添加两个抽象层次,一个获取按员工,日期和InDay计算分组的值的总和,另一个按员工和日期进行总和。 –
的确如此,对于Daynumber 42773,它将是InDay 1和2之间的差异,然后将InDay 3-4与这两个结果之间的差异合并为总时间 –
假设您只是想通过sql server查询结果,将这个查询的结果插入一个临时表,并按照Ross的说法。 – manderson