mysql - SQL SERVER (TSQL) 逆 DateDiff 的 SUM(SQL 或存储过程)

标签 mysql sql sql-server stored-procedures datediff

我有一个棘手的 SQL 需要创建,有这个表:

+-----------------------+
| 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 记录之间的中断持续时间。

有什么简单的方法可以使用 SQLStored 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

关于mysql - SQL SERVER (TSQL) 逆 DateDiff 的 SUM(SQL 或存储过程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29091671/

相关文章:

mysql - 每 5 分钟将 MSSQL 数据复制到 MySQL DB?

sql-server - 为什么 Azure 管理门户中的查询不起作用?

mysql 字符串比较 - md5 更快?

mysql - Django 一对多查询

SQL Server 可信连接在 IIS 中的用户错误,但 SSMS 正常

sql - 我只是不明白为什么这个查询不拉结果

sql - MIN/MAX 与 ORDER BY 和 LIMIT

php - MySQL 查询正在使用 MySQL 命令行,但不适用于 MySQLi

用于高级搜索的 php sql 查询

mysql - Magento - 如何按最大值选择mysql行?