早上好,
我有一个表格,每个项目都有一个“初始交付时间”和一个“最终交付时间”。我需要计算每次交付需要多少工作时间,然后**汇总(按最终交付时间)**以查看我的货件每天交付所需的平均工作时间。
对于我们的业务,我们认为“周一至周五的营业时间”为上午9点至下午6点(18:00)。
货件的初始时间可能安排在营业时间以外的任何时间。在这种情况下,我们必须仅在输入营业时间时开始盘点。例如:
如果货件的初始交付时间设定为周四下午7点,而最终交付时间为周五上午10点,则我们应仅考虑1个小时(从周五上午9点到周五上午10点,知道周四下午7点到周五上午9点是工作时间以外)。
尝试执行下面的查询-但它不遵守我们所有的业务规则(尚未聚合)
不幸的是,在办公室里,我们不能在SQL中使用“变量”(我们使用一种叫做Metadata的东西--这使得它更难
有人愿意帮我吗?
SELECT
SUM(
TIMESTAMPDIFF(
HOUR,
GREATEST(data_inicial, TIMESTAMP(DATE(data_inicial), '09:00:00')),
LEAST(data_final, TIMESTAMP(DATE(data_final), '18:00:00'))
)
) AS hours
FROM table
WHERE WEEKDAY(data_inicial) BETWEEN 0 AND 4
AND HOUR(data_inicial) < 18
AND WEEKDAY(data_final) BETWEEN 0 AND 4
AND HOUR(data_final) >= 9
UNION
SELECT
COUNT(*) * 9 AS hours
FROM table
WHERE WEEKDAY(data_inicial) BETWEEN 0 AND 4
AND HOUR(data_inicial) >= 9
UNION
SELECT
COUNT(*) * 9 AS horas_uteis
FROM table
WHERE WEEKDAY(data_final) BETWEEN 0 AND 4
AND HOUR(data_final) < 18;
字符串
1条答案
按热度按时间qjp7pelc1#
对于这个任务,我认为最好使用日历表。例如,这个日历表临时创建为CTE。
您可以使用带有索引的永久表,例如on(date,startH,endH,workDay),该表易于维护,工作日历有助于设置任何一天的属性,如节假日等。
在示例中,由最终交货制成的骨料
date
参见示例:
字符串
使用示例数据查询结果
| 最终数据|平均值H| CNT|
| --|--|--|
| 2023年10月23日|9万| 3 |
| 2023年10月26日星期五|14.8千| 5 |
| 2023年10月27日|一万七千元| 1 |
| 2023年10月24日|八点六六六七| 6 |
| 2023年10月28日|三万六千元| 1 |
| 2023年10月29日|三万七千元| 1 |
| 2023年10月30日|四万六千元| 1 |
| 2023年10月31日|五万五千元| 1 |
| 2023年11月5日|八万二| 1 |
| 2023年11月6日|九万元| 1 |
有效发运示例
| DT| CNT|
| --|--|
| 2023年10月23日| 15 |
| 2023年10月26日星期五| 12 |
| 2023年10月25日| 11 |
| 2023年10月27日| 7 |
| 2023年10月24日| 12 |
| 2023年10月28日| 6 |
| 2023年10月29日| 5 |
| 2023年10月30日| 4 |
| 2023年10月31日| 3 |
| 2023年11月5日| 2 |
| 2023年11月4日| 2 |
| 2023年11月3日| 2 |
| 2023年11月2日| 2 |
| 2023年11月1日| 2 |
| 2023年11月6日| 1 |
“按日期有效发运”示例
| DT| ID|数据初始化|最终数据|
| --|--|--|--|
| 2023年10月25日| 14 |2023年10月25日11时00分00秒|2023年10月26日13时00分00秒|
| 2023年10月25日| 15 |2023年10月25日11时00分00秒|2023年10月26日18时00分00秒|
| 2023年10月25日| 16 |2023年10月25日11时00分00秒|2023年10月26日20:00:00|
| 2023年10月25日| 17 |2023年10月25日11时00分00秒|2023年10月26日16时00分00秒|
| 2023年10月25日| 18 |2023年10月25日09时00分00秒|2023年10月26日17时00分00秒|
| 2023年10月25日| 33 |2023年10月23日19时00分00秒|2023年10月28日19时00分00秒|
| 2023年10月25日| 34 |2023年10月23日17时00分00秒|2023年10月29日19时00分00秒|
| 2023年10月25日| 35 |2023年10月23日17时00分00秒|2023年10月30日19时00分00秒|
| 2023年10月25日| 36 |2023年10月23日17时00分00秒|2023年10月31日19时00分00秒|
| 2023年10月25日| 37 |2023年10月23日17时00分00秒|2023年11月5日19时00分00秒|
| 2023年10月25日| 38 |2023年10月23日17时00分00秒|2023年11月6日17时00分00秒|
工作日历示例
| n| DT|工作日|启动H|末端H| WD| W| DN|
| --|--|--|--|--|--|--|--|
| 1 |2023年10月23日| 1 | 9 | 18 | 0 | 43 |周一|
| 2 |2023年10月24日| 1 | 9 | 18 | 1 | 43 |周二|
| 3 |2023年10月25日| 1 | 9 | 18 | 2 | 43 |周三|
| 4 |2023年10月26日星期五| 1 | 9 | 18 | 3 | 43 |周四|
| 5 |2023年10月27日| 1 | 9 | 18 | 4 | 43 |周五|
| 6 |2023年10月28日| 0 | 0 | 0 | 5 | 43 |周六|
| 7 |2023年10月29日| 0 | 0 | 0 | 6 | 44 |周日|
| 8 |2023年10月30日| 1 | 9 | 18 | 0 | 44 |周一|
在演示中,我将使用示例数据
型
Demo here