我的问题比标题暗示的要复杂一点,但现在是:
我有一张表格,其格式如下:
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的新手,所以我很沮丧如何开始这个。
答案 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分钟的间隔生成时间戳。