mySql 计算日期差之和

标签 mysql

我正在开发一个员工登录系统,其中记录用户 checkin 和结账时间。我有以下 mySql 表架构,我想从中查询特定月份员工的总工作时间。

AttendanceId    UserId  Operation   CreatedDate
24                 4       1       2016-03-20 23:18:59
25                 4       2       2016-03-20 23:19:50
26                 4       1       2016-03-20 23:20:28
27                 4       2       2016-03-20 23:20:31

操作1用于办理入住,操作2用于结帐。任何人都可以帮我构建这个查询吗?

最佳答案

这是一个令人愉快的复杂问题,谢谢。我的查询涉及:

  • 出勤时间并非以小时为单位精确衡量。计算结束时将秒数相加并除以 3600。
  • 两端跨越月份边界的出勤情况(感谢 strawberry )
  • 当月已开始(有操作“1”的条目)但尚未结束(没有相应操作“2”)的出勤。

我使用以下数据进行测试:

INSERT INTO Attendance(UserId, Operation, CreatedDate) VALUES
(4, 1, '2016-01-01 15:00:00'),
(4, 2, '2016-01-01 19:00:00'),
(4, 1, '2016-01-31 23:00:00'),
(4, 2, '2016-02-01 01:00:00'),
(4, 1, '2016-02-20 23:18:59'),
(4, 2, '2016-02-20 23:19:50'),
(4, 1, '2016-02-20 23:20:28'),
(4, 2, '2016-02-20 23:20:31'),
(4, 1, '2016-02-29 23:00:00'),
(4, 2, '2016-03-01 01:00:00'),
(4, 1, '2016-03-02 15:00:00'),
(4, 2, '2016-03-02 18:00:00'),
(4, 1, '2016-03-22 10:00:00');

该查询选择特定月份的所有用户的小时数。在一个查询中选择超过一个月的结果会更加复杂,因为出勤率可能跨越月份边界,如果需要,最简单的方法可能是迭代几个月并重复运行查询,并适当调整 SQL 中的四个日期。

最里面的查询选择所有用户的所有到达时间和相应的出发时间。然后,外部查询将它们限制为当前月份,计算两个时间之间的差异,并按用户对它们进行求和。

SELECT UserId, SUM(TIMESTAMPDIFF(
    SECOND,
    GREATEST(TimeIn, '2016-02-01'),
    LEAST(COALESCE(TimeOut, NOW()), '2016-03-01'))) / 3600 HoursInMonth
FROM (SELECT TimeIn.UserId, TimeIn.CreatedDate TimeIn, MIN(TimeOut.CreatedDate) TimeOut
      FROM Attendance TimeIn
      LEFT JOIN Attendance TimeOut ON TimeOut.UserId = TimeIn.UserId
                                  AND TimeOut.Operation = 2
                                  AND TimeOut.CreatedDate > TimeIn.CreatedDate
      WHERE TimeIn.operation = 1
      GROUP BY TimeIn.AttendanceId
      ORDER BY TimeIn.CreatedDate) TimeInOut
WHERE DATE_FORMAT(TimeIn,  '%Y-%m') = '2016-02'
   OR DATE_FORMAT(TimeOut, '%Y-%m') = '2016-02'
   OR (DATE_FORMAT(TimeIn, '%Y-%m') < '2016-02' AND TimeOut IS NULL)
GROUP BY UserId;

关于mySql 计算日期差之和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36150387/

相关文章:

php - 如何比较 mysql 数据库中的 IP 地址?

PHP Mysql 时间间隔查询

PHP While 语句仅从表中删除一行 Mysql PDO

mysql - 带有日期时间单元格的 Excel SUMIF 与日期时间单元格数组的比较(OR 语句)

mysql - 查询 MySQL 数据库

C# MySQL 参数不起作用

mysql - 如何解决UnhandledPromiseRejectionWarning?

php - 将数组与外部数组组合

mysql - Magento 联合 SQL

php - 从点击的按钮获取 URL