获取不包括周末的日期之间的小时数
Get number of hours between dates excluding weekends
我需要计算两个日期之间的小时数,其中之一是 NOW(),不包括周末。
我找到了一些使用存储过程或 mysql 函数的解决方案,但我希望在单个查询中执行此操作。
我可以用这个得到一般的时差:
SELECT HOUR(TIMEDIFF(NOW(), created_at))
但我只需要在工作日的 return 小时,而不是周末。所以从周五 23:00 到周一 1:00 应该只有 2 小时的时差。
如有任何帮助,我们将不胜感激。
谢谢!
Mysql 8
在编程语言中,您将编写一个循环并通过遍历日期来总结小时数。在 SQL 中,您可以对递归查询执行相同的操作:
with recursive cte (id, dt, minutes) as
(
select
id,
date(created_at),
case
when dayofweek(created_at) in (1, 7) then 0
else timestampdiff(minute, created_at, least(now(), date(created_at) + interval 1 day))
end
from mytable
union all
select
id,
dt + interval 1 day,
case
when dayofweek(dt + interval 1 day) in (1, 7) then 0
else timestampdiff(minute, dt + interval 1 day, least(now(), dt + interval 2 day))
end
from cte
where dt + interval 1 day <= curdate()
)
select id, round(sum(minutes) / 60, 1) as hours
from cte
group by id
order by id;
演示:https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=a08f96bc29fb8a51302da10679496e22
我需要计算两个日期之间的小时数,其中之一是 NOW(),不包括周末。 我找到了一些使用存储过程或 mysql 函数的解决方案,但我希望在单个查询中执行此操作。
我可以用这个得到一般的时差:
SELECT HOUR(TIMEDIFF(NOW(), created_at))
但我只需要在工作日的 return 小时,而不是周末。所以从周五 23:00 到周一 1:00 应该只有 2 小时的时差。
如有任何帮助,我们将不胜感激。
谢谢!
Mysql 8
在编程语言中,您将编写一个循环并通过遍历日期来总结小时数。在 SQL 中,您可以对递归查询执行相同的操作:
with recursive cte (id, dt, minutes) as
(
select
id,
date(created_at),
case
when dayofweek(created_at) in (1, 7) then 0
else timestampdiff(minute, created_at, least(now(), date(created_at) + interval 1 day))
end
from mytable
union all
select
id,
dt + interval 1 day,
case
when dayofweek(dt + interval 1 day) in (1, 7) then 0
else timestampdiff(minute, dt + interval 1 day, least(now(), dt + interval 2 day))
end
from cte
where dt + interval 1 day <= curdate()
)
select id, round(sum(minutes) / 60, 1) as hours
from cte
group by id
order by id;
演示:https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=a08f96bc29fb8a51302da10679496e22