mysql - 如何总结没有周末的休假时间

标签 mysql datetime sum datediff

在这种情况下,在 mysql 数据库中,我在“leave”表中插入了新的休假:

+--------+---------+---------+-------------+----------+--------------------------
|ID_LEAVE|ID_WORKER| FNAME   | LNAME | BEGIN_DATE         | END_DATE            | 
+--------+---------+---------+---------+-------------+--------------------+------
| 5      |   10    | MARIO   | NEED  |2019-03-22 07:00:00 |2019-03-25 15:00:00  | 
+--------+---------+---------+-------------+----------+-------------------------- 

当我在下面的 mysql 查询中总结休假时间时:

SELECT leave.ID_LEAVE, 
leave.ID_WORKER, 
leave.BEGIN_DATE, 
leave.END_DATE, 
time_format(SUM((datediff(leave.END_DATE, leave.BEGIN_DATE) + 1) * (time(leave.END_DATE) - time(leave.BEGIN_DATE))), '%H:%i:%s') AS 'LEAVE TIME'
FROM leave 
GROUP BY leave.ID_LEAVE

我的结果是 LEAVE TIME = 32:00:00

但我发现它也计算周末(周六和周日)。我不知道如果没有周末我应该如何改变。在这种情况下,离开时间应为 16:00:00。有人可以请问我可以更改什么样的查询吗?感谢您的任何建议。 :)

最佳答案

您可以使用日历表 ( based on this solution ) 使用以下解决方案:

SELECT ID_LEAVE, SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(TIME(end_date), TIME(begin_date)))))
FROM (
    SELECT ADDDATE('1970-01-01', t4 * 10000 + t3 * 1000 + t2 * 100 + t1 * 10 + t0) AS date_value
    FROM
        (SELECT 0 t0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t0,
        (SELECT 0 t1 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t1,
        (SELECT 0 t2 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t2,
        (SELECT 0 t3 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t3,
        (SELECT 0 t4 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t4
) calendar INNER JOIN `leave` ON calendar.date_value BETWEEN DATE(leave.BEGIN_DATE) AND DATE(leave.END_DATE)
WHERE NOT WEEKDAY(date_value) IN (5, 6)
GROUP BY ID_LEAVE

demo on db-fiddle.com

关于mysql - 如何总结没有周末的休假时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55598108/

相关文章:

c# - 通过 .NetCore SQLConnection 到 MariaDB localhost

sql - 根据标准 SQL Server 将单列求和为多列

MySQL - SUM 和 COUNT 有什么区别?

python - Python 中 timedelta 对象的百分比?

PHP DateTime,解析字符串日期失败

sql - 每小时值总和

mysql - MySql 中的时间戳和夏令时 [dst]

mysql - SQL左连接问题

java - MySQL 和 Java : Byte array not same when retrieved as it was when stored

c# - sql datediff 的精确 c# 结果