【发布时间】:2017-05-20 04:21:51
【问题描述】:
我想获取 2016 年 16 月 11 日 09:00 > 2016 年 12 月 15 日 17:30 之间的工作时间总和(持续时间)。为了实现这一点,我需要计算两个日期之间每天工作的持续时间,然后将它们相加得到每月的工作时间。
EventTime 表将包含用户每次开始工作时打卡、午餐时间打卡、午餐后打卡以及一天结束时打卡的数据。
我已经设法让它工作了一天:
EMPLOYEE CLOCK IN CLOCK OUT DURATION
Tatjana 05/01/2017 08:33 05/01/2017 13:12 04:39
Harj 05/01/2017 10:59 05/01/2017 14:20 03:20
Tomasz 05/01/2017 09:55
John 05/01/2017 09:57
Sam 05/01/2017 08:11 05/01/2017 14:11 05:59
Paul 05/01/2017 09:39 05/01/2017 14:05 04:26
Adrian 05/01/2017 13:59
Sophie 05/01/2017 08:42
Meg 05/01/2017 07:56 05/01/2017 13:10 05:14
Anna 05/01/2017 07:59 05/01/2017 12:30 04:31
Adriana 05/01/2017 07:46 05/01/2017 12:44 04:58
Jacky 05/01/2017 09:01
Anna 05/01/2017 07:57 05/01/2017 12:29 04:32
Kelly 05/01/2017 07:56 05/01/2017 12:45 04:48
Ana 05/01/2017 07:41 05/01/2017 14:13 06:32
以上是使用以下查询实现的:
SELECT
u.Field14_50 AS EmployeeID,
u.Firstname,
u.Surname,
MIN(e.EventTime) AS [Clocked In],
CASE
WHEN MAX(e.EventTime) = MIN(e.EventTime) THEN NULL
WHEN MAX(e.EventTime) > MIN(e.EventTime) THEN MAX(e.EventTime)
END AS [Clocked Out],
CASE
WHEN MAX(e.EventTime) = MIN(e.EventTime) THEN NULL
WHEN MAX(e.EventTime) > MIN(e.EventTime) THEN FORMAT((DATEDIFF(SECOND, MIN(e.EventTime), MAX(e.EventTime)) / 3600) % 24, '00') + ':' + FORMAT((DATEDIFF(SECOND, MIN(e.EventTime), MAX(e.EventTime)) / 60) % 60, '00')
END AS [Duration]
FROM
UsersEx AS u
INNER JOIN
EventsEx AS e
ON
u.UserID = e.UserID
WHERE
u.Field14_50 <> ''
AND
u.DepartmentName IN (
'Production',
'Finance and Administration',
'Purchase',
'Sales',
'Warehouse'
)
AND
DAY(e.EventTime) = DAY(GETDATE()) AND MONTH(e.EventTime) = MONTH(GETDATE()) AND YEAR(e.EventTime) = YEAR(GETDATE())
AND
e.PeripheralName IN ('TIME AND ATTENDANCE OFFICE (In)', 'TIME AND ATTENDANCE OFFICE (Out)')
GROUP BY
u.Field14_50,
u.UserID,
u.FirstName,
u.Surname
ORDER BY
u.Surname ASC
我希望这很清楚。
提前致谢。
更新:2017 年 6 月 1 日
我可以使用以下查询:
SELECT
u.FirstName,
e.EventTime
FROM
UsersEx AS u
INNER JOIN
EventsEx AS e
ON
u.UserID = e.UserID
WHERE
u.Field14_50 <> ''
AND
e.EventTime > '2016/11/16' AND e.EventTime < '2016/12/16'
AND
e.PeripheralName IN ('TIME AND ATTENDANCE OFFICE (In)', 'TIME AND ATTENDANCE OFFICE (Out)')
AND
u.DepartmentName IN ('Finance and Administration')
ORDER BY
u.Field14_50,
e.EventTime
ASC
要得到这个结果:
Ram 16/11/2016 09:12
Ram 16/11/2016 12:59
Ram 16/11/2016 13:39
Ram 16/11/2016 17:47
Ram 17/11/2016 09:35
Ram 17/11/2016 12:45
Ram 17/11/2016 13:11
Ram 17/11/2016 17:43
Ram 21/11/2016 09:14
Ram 21/11/2016 12:24
Ram 21/11/2016 12:53
Ram 21/11/2016 17:36
Ram 22/11/2016 09:18
Ram 22/11/2016 13:32
Ram 22/11/2016 17:45
Ram 23/11/2016 09:10
Ram 23/11/2016 13:13
Ram 23/11/2016 13:51
Ram 24/11/2016 09:10
Ram 24/11/2016 13:15
Ram 24/11/2016 13:50
Ram 24/11/2016 17:41
Ram 25/11/2016 09:12
Ram 25/11/2016 17:36
Ram 28/11/2016 09:05
Ram 28/11/2016 12:32
Ram 28/11/2016 13:12
Ram 28/11/2016 17:40
Ram 29/11/2016 09:17
Ram 29/11/2016 12:45
Ram 29/11/2016 13:16
Ram 29/11/2016 17:50
Ram 30/11/2016 09:15
Ram 30/11/2016 12:51
Ram 30/11/2016 13:55
Ram 30/11/2016 17:31
Ram 01/12/2016 09:10
Ram 01/12/2016 12:44
Ram 01/12/2016 13:12
Ram 01/12/2016 17:36
Ram 02/12/2016 09:00
Ram 02/12/2016 12:19
Ram 02/12/2016 12:51
Ram 02/12/2016 17:38
Ram 05/12/2016 09:14
Ram 05/12/2016 12:45
Ram 05/12/2016 13:28
Ram 05/12/2016 17:45
Ram 06/12/2016 09:32
Ram 06/12/2016 12:15
Ram 06/12/2016 12:49
Ram 06/12/2016 17:51
Ram 07/12/2016 09:09
Ram 07/12/2016 12:43
Ram 07/12/2016 13:22
Ram 07/12/2016 17:51
Ram 08/12/2016 09:18
Ram 08/12/2016 12:54
Ram 08/12/2016 13:16
Ram 08/12/2016 17:39
Ram 09/12/2016 09:09
Ram 09/12/2016 18:02
Ram 12/12/2016 09:20
Ram 12/12/2016 12:55
Ram 12/12/2016 13:20
Ram 12/12/2016 17:47
Ram 13/12/2016 09:13
Ram 13/12/2016 13:10
Ram 13/12/2016 13:37
Ram 13/12/2016 18:01
Ram 15/12/2016 09:07
Ram 15/12/2016 12:37
Ram 15/12/2016 13:12
Ram 15/12/2016 17:53
Yuka 16/11/2016 08:52
Yuka 16/11/2016 19:05
Yuka 17/11/2016 09:02
Yuka 17/11/2016 18:25
Yuka 18/11/2016 08:23
Yuka 18/11/2016 18:26
Yuka 21/11/2016 08:12
Yuka 21/11/2016 17:59
Yuka 22/11/2016 08:51
Yuka 22/11/2016 17:44
Yuka 23/11/2016 08:43
Yuka 23/11/2016 18:07
Yuka 24/11/2016 08:42
Yuka 24/11/2016 18:24
Yuka 25/11/2016 08:37
Yuka 25/11/2016 17:34
Yuka 28/11/2016 08:44
Yuka 28/11/2016 18:03
Yuka 29/11/2016 08:11
Yuka 29/11/2016 16:58
Yuka 12/12/2016 08:51
Yuka 12/12/2016 17:57
Yuka 13/12/2016 07:51
Yuka 13/12/2016 18:30
Yuka 14/12/2016 08:32
Yuka 14/12/2016 18:04
Yuka 15/12/2016 08:40
Yuka 15/12/2016 18:09
Duncan 16/11/2016 07:25
Duncan 16/11/2016 18:28
Duncan 17/11/2016 07:25
Duncan 17/11/2016 17:48
Duncan 18/11/2016 07:29
Duncan 21/11/2016 07:33
Duncan 21/11/2016 17:48
Duncan 22/11/2016 07:31
Duncan 22/11/2016 18:14
Duncan 23/11/2016 07:43
Duncan 24/11/2016 07:21
Duncan 25/11/2016 07:32
Duncan 28/11/2016 07:35
Duncan 28/11/2016 18:11
Duncan 29/11/2016 07:34
Duncan 30/11/2016 07:35
Duncan 30/11/2016 18:21
Duncan 01/12/2016 07:27
Duncan 01/12/2016 17:57
Duncan 02/12/2016 07:38
Duncan 05/12/2016 07:29
Duncan 05/12/2016 18:12
Duncan 06/12/2016 07:28
Duncan 06/12/2016 17:37
Duncan 07/12/2016 07:13
Duncan 07/12/2016 07:19
Duncan 07/12/2016 18:01
Duncan 08/12/2016 07:22
Duncan 08/12/2016 17:56
Duncan 09/12/2016 07:24
Duncan 09/12/2016 17:30
现在如何从该结果集中获取每个用户每天的 MIN 和 MAX(如下所示)?
Employee Clocked In Clocked Out Duration
Ram 16/11/2016 09:12 16/11/2016 17:47 08:35
Ram 17/11/2016 09:35 17/11/2016 17:43 08:08
...
Ram 13/12/2016 09:13 13/12/2016 18:01 08:48
Ram 15/12/2016 09:07 15/12/2016 17:53 08:46
and so on for each employee...
【问题讨论】:
-
您应该将每个 Duration 转换为秒,然后转换为格式 HH:MM stackoverflow.com/questions/1262497/…
-
你能给我一个反馈吗?我发布了一个可能的解决方案。请检查一下
-
您添加了一个新请求。即便如此,请检查我的答案的更新并验证它是否适合您
标签: sql sql-server database tsql