【问题标题】:Get number of hours between dates excluding weekends获取日期之间的小时数,不包括周末
【发布时间】:2020-11-26 00:01:45
【问题描述】:

我需要计算两个日期之间的小时数,其中一个是 NOW(),不包括周末。 我找到了一些使用存储过程或 mysql 函数的解决方案,但我希望在单个查询中执行此操作。

我可以使用这个来获得一般的小时差:

SELECT HOUR(TIMEDIFF(NOW(), created_at))

但我只需要返回工作日的几个小时,而不是周末。所以从周五 23:00 到周一 1:00 应该只有 2 小时的差异。

任何帮助将不胜感激。

谢谢!

Mysql 8

【问题讨论】:

  • 这很难。这需要来计算。数据库有利于检索东西,它们不利于对东西进行计算。我建议您停止在单个查询中执行此操作。即使有人提供了解决方案,这也将是一个怪物。你可以用一种实际的编程语言更优雅地做到这一点。
  • 指定 MySQL 版本。
  • @akina 我刚刚更新了。版本 8。
  • 在 CTE 的源日期范围内生成周末日期列表。在另一个 CTE 中的不同日期解析每个周期。加入和删除工作日。分组并计算结果。

标签: mysql sql datetime recursive-query mysql-8.0


【解决方案1】:

在编程语言中,您可以编写一个循环并通过迭代天数来总结小时数。在 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

【讨论】:

  • 正是我需要的。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-22
  • 1970-01-01
  • 1970-01-01
  • 2019-12-10
  • 1970-01-01
  • 2011-04-06
  • 2023-03-10
相关资源
最近更新 更多