MySQL月报不准确

时间:2015-07-30 10:21:52

标签: mysql datediff

我的公司已经为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

关于如何准确报告,我有点失落。有没有人有任何建议或想法?提前谢谢。

1 个答案:

答案 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 |
+------+---------+-------+