【问题标题】:How to get the count of specific days from week between a date range in mysql?如何获取mysql中日期范围之间一周中特定天数的计数?
【发布时间】:2014-08-17 03:12:02
【问题描述】:

我有一个包含列的表“task_table”-

任务 ID、开始日期、结束日期

我还有一个“配置”表,其中记录了一周中的哪几天是工作日。 此表有两列 -

week_day, isHoliday

并且此表包含 7 条记录,因为 week_days 是 Monday,Tuesday.....Sunday ,并且每条记录都有一个 1 或 0 条目。如果一天是任何组织的假期,那么将有 0 反对日。就像如果一个组织每周的周三和周五有假期,那么只有周三和周五才会有 0。

现在我想进行 SQL 查询以获取 Task_id、Start_date、End_date 以及每个任务消耗的总天数。 (这些天是任务 start_date 和 end_date 之间的天数,不包括“配置”表中配置的节假日。)

【问题讨论】:

  • 请在sqlfiddle.com 中添加表格和一些示例数据以及从示例数据到您的问题的日期范围的所需输出。
  • "此表包含 7 条记录" 这对我来说毫无意义。
  • 我正在尝试仅计算日期范围内的星期三和星期五的数量,但我无法获得该数量
  • 七条记录意味着每个组织的“配置”表包含七条记录,即一周的 7 天。

标签: mysql sql


【解决方案1】:

我现在没有时间完全回答这个问题,但我会做的是:

获取 Start_date 周开始时的日期,以及 End_date 周结束时的日期(您可以通过 date_adding 根据一周中的日期获取天数。

然后你想比较它们的日期,除以 7,乘以 2,然后删除任何你会添加的内容(例如,如果开始日期是星期四,那么你需要从结果中删除一个,因为你会已经为前一个星期三数了一个。

如果没有其他人提出更好的答案,我将在明天将代码写出来(这里已经很晚了 - 大约 14 小时后。)。

编辑:是的,没有正确阅读问题,但该策略仍然适用,但有点摆弄。说到这里,here is the fiddle of my solution

归结为以下代码:

set @holidaysPerWeek = (select sum(isHoliday) from configuration);

select 
  Task_id,
  ((dateDiff(
    DATE_ADD(End_Date, INTERVAL 7 - DayOfWeek(End_Date) DAY),
    DATE_ADD(Start_Date, INTERVAL -DayOfWeek(Start_Date) + 1 Day)) + 1) / 7)
    * @holidaysPerWeek
    - (select sum(isHoliday) from configuration where week_day > DayOfWeek(End_Date))
    - (select sum(isHoliday) from configuration where week_day < DayOfWeek(Start_Date)),
  DayOfWeek(End_Date)
from task_table

这与我之前所说的完全一样,但是在整个星期中分布的“周末”数量是可变的,首先选择整个星期的假期数量,然后删除之前或之后的假期分别是开始日期和结束日期。

【讨论】:

  • 感谢您的建议。但我认为如果星期一是假期并且我们的开始日期是星期四,这将行不通
  • @NikunjAggarwal 更新了我的答案,抱歉,这比我想象的要长一点,我午休时间没能做到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-05
  • 2021-12-31
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多