选择输出在特定时间段内的行数的查询

时间:2018-06-03 22:11:39

标签: mysql sql select

我的问题比标题暗示的要复杂一点,但现在是:

我有一张表格,其格式如下:

name time_in              time_out             location
1    2018-05-31 10:09:00  2018-05-31 16:06:00  1
3    2018-05-31 10:12:00  2018-05-31 17:03:00  1

我想要一个选择查询,它返回每个位置在15分钟时间范围内工作的人的总时间(以小时为单位)。以下是给定的两行的示例输出:

time                 labor_hours  location
2018-05-31 10:00:00  .15          1
2018-05-31 10:15:00  .50          1
2018-05-31 10:30:00  .50          1
2018-05-31 10:45:00  .50          1
2018-05-31 11:00:00  .50          1
...
2018-05-31 15:45:00  .50          1
2018-05-31 16:00:00  .35          1
2018-05-31 16:15:00  .25          1
2018-05-31 16:30:00  .25          1
2018-05-31 16:45:00  .25          1
2018-05-31 17:00:00  .10          1

工时是指在15分钟内完成的工作小时数(以小时为单位)。因此,例如,通过查看前两行计算第一行,并且从10:00:00 - 10:15:00看到员工1和2工作总共9分钟。因为它在9/60 = .15的小时内。

我是sql的新手,所以我很沮丧如何开始这个。

1 个答案:

答案 0 :(得分:2)

如果您使用MySQL 8.0,则可以使用CTE功能,如下所示

WITH cte (timeStamp) AS
(
  SELECT "2018-05-31 00:00:00"
  UNION ALL
  SELECT TIMESTAMPADD(MINUTE, 15, timeStamp) 
  WHERE timeStamp < 2018-06-01 00:00:00
)
SELECT timeStamp FROM cte;

SELECT cte.time, 
sum(TIMESTAMPDIFF(MINUTE, punch.time, 
                  TIMESTAMPAD(MINUTE, 15, cte.timeStamp))) as labour_hours, 
punch.location 
FROM cte LEFT OUTER JOIN punch ON punch.time >=cte.timeStamp 
AND punch.time < TIMESTAMPADD(MINUTE, 15, cte.timeStamp)
GROUP BY punch.location, cte.timeStamp

如果您使用的是较旧版本的MySQL,则需要创建一个stored procedure,以15分钟的间隔生成时间戳。