用于计算工时的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并对所需字段进行分组。