SQL 服务器 (TSQL) 逆 DateDiff 的总和(SQL 或存储过程)
SQL SERVER (TSQL) SUM of inverse DateDiff (SQL or Stored Procedure)
我有一个棘手的 SQL
来创建,有这个 table:
+-----------------------+
| Employee Login Logout |
+-----------------------+
| 1 08:30 08:50 |
| 1 09:00 10:00 |
| 1 10:20 11:00 |
+-----------------------+
我需要一个sql来总结所有的休息时间:
08:50 -> 09:00 = 10 minutes +
10:00 -> 10:20 = 20 minutes =
30 minutes in total
所以我需要以某种方式检查每条记录并使用 datediff
方法 sum
记录之间的间隔时间。
有什么简单的方法可以使用 SQL
或 Stored Procedure
吗?
正如@thebjorn 所评论的那样,您可以先得到第一次登录和最后一次注销(工作班次)之间的差异,然后减去每个登录-注销对的差异的 SUM
(您的实际时间正在工作)。结果将是您不工作的总时间或您的休息时间。
;WITH SampleData(Employee, Login, Logout) AS(
SELECT 1, CAST('08:30' AS TIME), CAST('08:50' AS TIME) UNION ALL
SELECT 1, CAST('09:00' AS TIME), CAST('10:00' AS TIME) UNION ALL
SELECT 1, CAST('10:20' AS TIME), CAST('11:00' AS TIME)
)
SELECT
Employee,
TotalBreakTime = DATEDIFF(MINUTE, MIN(Login), MAX(Logout)) - SUM(DATEDIFF(MINUTE, Login, Logout))
FROM SampleData
GROUP BY Employee
使用LAG
函数
;WITH SampleData(Employee, Login, Logout) AS(
SELECT 1, CAST('08:30' AS TIME), CAST('08:50' AS TIME) UNION ALL
SELECT 1, CAST('09:00' AS TIME), CAST('10:00' AS TIME) UNION ALL
SELECT 1, CAST('10:20' AS TIME), CAST('11:00' AS TIME) UNION ALL
SELECT 2, CAST('10:00' AS TIME), CAST('10:30' AS TIME) UNION ALL
SELECT 2, CAST('10:45' AS TIME), CAST('11:30' AS TIME)
)
,CteBreakTime AS(
SELECT *,
BreakTime = DATEDIFF(MINUTE, LAG(Logout) OVER(PARTITION BY Employee ORDER BY Login), Login)
FROM SampleData
)
SELECT
Employee,
TotalBreakTime = SUM(BreakTime)
FROM CteBreakTime
GROUP BY Employee
我有一个棘手的 SQL
来创建,有这个 table:
+-----------------------+
| Employee Login Logout |
+-----------------------+
| 1 08:30 08:50 |
| 1 09:00 10:00 |
| 1 10:20 11:00 |
+-----------------------+
我需要一个sql来总结所有的休息时间:
08:50 -> 09:00 = 10 minutes +
10:00 -> 10:20 = 20 minutes =
30 minutes in total
所以我需要以某种方式检查每条记录并使用 datediff
方法 sum
记录之间的间隔时间。
有什么简单的方法可以使用 SQL
或 Stored Procedure
吗?
正如@thebjorn 所评论的那样,您可以先得到第一次登录和最后一次注销(工作班次)之间的差异,然后减去每个登录-注销对的差异的 SUM
(您的实际时间正在工作)。结果将是您不工作的总时间或您的休息时间。
;WITH SampleData(Employee, Login, Logout) AS(
SELECT 1, CAST('08:30' AS TIME), CAST('08:50' AS TIME) UNION ALL
SELECT 1, CAST('09:00' AS TIME), CAST('10:00' AS TIME) UNION ALL
SELECT 1, CAST('10:20' AS TIME), CAST('11:00' AS TIME)
)
SELECT
Employee,
TotalBreakTime = DATEDIFF(MINUTE, MIN(Login), MAX(Logout)) - SUM(DATEDIFF(MINUTE, Login, Logout))
FROM SampleData
GROUP BY Employee
使用LAG
函数
;WITH SampleData(Employee, Login, Logout) AS(
SELECT 1, CAST('08:30' AS TIME), CAST('08:50' AS TIME) UNION ALL
SELECT 1, CAST('09:00' AS TIME), CAST('10:00' AS TIME) UNION ALL
SELECT 1, CAST('10:20' AS TIME), CAST('11:00' AS TIME) UNION ALL
SELECT 2, CAST('10:00' AS TIME), CAST('10:30' AS TIME) UNION ALL
SELECT 2, CAST('10:45' AS TIME), CAST('11:30' AS TIME)
)
,CteBreakTime AS(
SELECT *,
BreakTime = DATEDIFF(MINUTE, LAG(Logout) OVER(PARTITION BY Employee ORDER BY Login), Login)
FROM SampleData
)
SELECT
Employee,
TotalBreakTime = SUM(BreakTime)
FROM CteBreakTime
GROUP BY Employee