我的公司已经为IT部门引入了一个随叫随到的rota。我创建了一个MySQL表格,详细说明了接听电话的人员,接听电话的时间以及每个班次完成时下一个人的接听时间。
以下是从5月下旬至6月上旬采取的样本(删除了姓名):
|seq__num | date_taken | date_relinquished | user |
|-----------|---------------|-----------------------|-----------|
| 1 | 2015-05-29 | 2015-06-05 | A |
| 2 | 2015-06-05 | 2015-06-06 | B |
| 3 | 2015-06-06 | 2015-06-07 | C |
| 4 | 2015-06-07 | 2015-06-10 | B |
| 5 | 2015-06-10 | 2015-06-10 | A |
| 6 | 2015-06-10 | 2015-06-12 | B |
| 7 | 2015-06-12 | 2015-06-19 | C |
| 8 | 2015-06-19 | 2015-07-03 | D |
下一步是制作一份自动月度报告,查询表并输出每个用户随叫随到的天数,以便财务知道他们需要支付多少钱。目前,这是手动计算的。
我得到的问题是:
SELECT user, SUM(DATEDIFF(date_relinquished, date_taken))
AS duration
FROM on-call_log
WHERE YEAR(date_relinquished) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH)
AND MONTH(date_relinquished) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)
GROUP BY user
如果在一个月内完成保持待命,这确实有效。如果有人在一个月内接听电话,则报告整个时段,这会产生不准确的情况。而不是报告六月实际上有30天,如此:
A 4
B 6
C 8
D 12
它考虑了A人在上个月接听电话的方式,D人将其带入下个月,如下所示:
A 7
B 6
C 8
D 14
关于如何准确报告,我有点失落。有没有人有任何建议或想法?提前谢谢。
答案 0 :(得分:0)
一种解决方案是使用日历表 - 即使是一个日历表,其中包含所有合理的日期,也是令人沮丧的!
然后您的查询可能如下所示 - 我已经假设每个用户每天只有一次通话(DISTINCT)...
SELECT user
, DATE_FORMAT(dt,'%Y-%m') month
, COUNT(DISTINCT dt) total
FROM calendar x
JOIN my_table y
ON x.dt BETWEEN y.date_taken AND y.date_relinquished
GROUP
BY month
, user;
+------+---------+-------+
| user | month | total |
+------+---------+-------+
| A | 2015-05 | 3 |
| A | 2015-06 | 6 |
| B | 2015-06 | 8 |
| C | 2015-06 | 10 |
| D | 2015-06 | 12 |
| D | 2015-07 | 3 |
+------+---------+-------+