【问题标题】:Distribute a weekly quota over weekdays in MySQL在 MySQL 中的工作日分配每周配额
【发布时间】:2017-11-04 06:20:41
【问题描述】:

我的一位客户正在销售捕鱼许可证。他们对每个捕鱼区都有每周配额。此配额必须在开放的工作日(有些可能关闭)之间平均分配。休息日将由逗号分隔的列表表示,其中包含从 1 到 7 的日期编号。例如。没有休息日的特定一周的每周配额为 14 个许可证。这意味着一周中的每一天都有 2 个许可证可用。

我需要一个根据包含每周配额的表格给出任何给定日期的配额的选择。我已经编写了给出所需结果的查询,但我确信它可以写成一个更短的等式而不使用 CASE 语句。但是我的数学技能不足以解决这样的问题:p

对于第 1 天,它只是将配额除以 7。 对于第 2 天,它首先减去第 1 天的配额,然后除以一周中剩余 6 天的剩余部分。 ...等等。

如果一天是关闭的,则查询中的每个除数都必须减 1...等等。

Kvote = 配额

            (CASE WEEKDAY(calendar.dy)+1
                WHEN 1 THEN CEIL(Kvote/7)
                WHEN 2 THEN CEIL((Kvote-CEIL(Kvote/7))/6)
                WHEN 3 THEN CEIL((Kvote-CEIL(Kvote/7)-CEIL((Kvote-CEIL(Kvote/7))/6))/5)
                WHEN 4 THEN CEIL((Kvote-CEIL(Kvote/7)-CEIL((Kvote-CEIL(Kvote/7))/6)-CEIL((Kvote-CEIL(Kvote/7)-CEIL((Kvote-CEIL(Kvote/7))/6))/5))/4)
                WHEN 5 ...
                WHEN 6 ...
                WHEN 7 ...
           END) AS DayQuota

SQLFiddle here

【问题讨论】:

  • 我看不出这是如何考虑周一售出的许可证数量的?如果星期天很近,为什么要除以 7?
  • 你是对的。我昨天开始写这个问题,今天完成了。同时我做了一些改变前提条件的工作。我现在已经更新了这个问题。对不起。
  • 哪些天开放,哪些关闭的信息在哪里?如果存在,则说明您没有在查询中使用它。
  • 哦,对了。休息日将由逗号分隔的列表表示,从 1 到 7。将再次更新我的问题。

标签: mysql math equation


【解决方案1】:

此表达式给出的结果与您问题中的 CASE WHEN 表达式相同:

FLOOR(Kvote/7) + (WEEKDAY(calendar.dy) < Kvote % 7)

查看updated fiddle中的比较

【讨论】:

  • 我喜欢它。非常感谢! :-)
猜你喜欢
  • 2018-07-18
  • 1970-01-01
  • 2021-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多