在MySQL的工作日分发每周配额

时间:2017-11-03 21:33:11

标签: mysql math equation

我的一位客户正在出售捕鱼许可证。他们每个渔区都有每周配额。该配额必须在开放的工作日(有些可能已关闭)之间平均分配。封闭日期将以逗号分隔的列表表示,其中包含1-7的日期编号。例如。没有关闭日期的特定周的每周配额是14个许可证。这意味着一周中每天都有2个许可证。

我需要一个select,它根据包含每周配额的表格为任何给定日期提供配额。我写了这个查询,给出了所需的结果,但我确信它可以写成一个更短的方程而不使用CASE语句。然而,我的数学技能还不足以解决这个问题:p

对于第1天,它只是将配额除以7。 对于第2天,它首先减去第1天的配额,然后将剩余的6天分成剩余的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

1 个答案:

答案 0 :(得分:1)

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

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

请参阅updated fiddle

中的比较