[英]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.