获取MySQL中某个月的第一个和最后一个工作日

时间:2016-01-28 00:10:36

标签: mysql

非常相似 Get the first and last date of next month in MySQL,但我希望获得MySQL中某个月的第一个和最后一个工作日。在这里,工作日意味着周一〜周五,或DAYOFWEEK(日期)> = 2和< = 6.让我们不要考虑假期。

例如(我选择了2月,因为飞跃应该是最复杂的)

2014-02 -> 2014-02-03 (Mon) ~ 2014-02-28 (Fri)
2015-02 -> 2015-02-02 (Mon) ~ 2015-02-27 (Fri)
2016-02 -> 2016-02-01 (Mon) ~ 2016-02-29 (Mon)

3 个答案:

答案 0 :(得分:1)

E.g:

SELECT MIN(dt),MAX(dt) FROM calendar WHERE DAYOFWEEK (dt) NOT IN(1,7) AND dt BETWEEN '2016-01-01' AND '2016-01-31';

答案 1 :(得分:0)

这里有一些伪代码开始考虑问题。对于工作日的开始(结束)检查,如果没有,则提前一天(备份)。重复测试并可能再次向前(向后)跳跃。你永远不会动两次以上。

/* <som> = start of month */
case
    when not (dayofweek(<som>) between 2 and 6)
    then
        case
            when not (dayofweek(<som> + 1) between 2 and 6)
            then <som> + 2
            else <som> + 1
        end
    else <som>
end

/* <eom> = end of month */
case
    when not (dayofweek(<eom>) between 2 and 6)
    then
        case
            when not (dayofweek(<eom> - 1) between 2 and 6)
            then <eom> - 2
            else <eom> - 1
        end
    else <eom>
end

我不是MySQL的权威,但你可以使用这些替换我相信:

<som> -> date_sub(<dt>, interval dayofmonth(<dt>) - 1 day)
<eom> => last_day(<dt>)

有不同的方法来重写它是等效的。上面的方法可能是许多人最初会想到这个问题的方式,但它实际上比这更简单。因为一旦我知道哪个周末的日期临近,我也知道在下一个(上一个)工作日之前有多少天。这可以作为三个简单的案例来处理:

case dayofweek(<som>)
    when 7 then <som> + 2
    when 1 then <som> + 1
    else <som>
end

case dayofweek(<eom>)
    when 7 then <eom> - 1
    when 1 then <eom> - 2
    else <eom>
end

答案 2 :(得分:-1)

在任何一个月的第一天喂养第1天:

SELECT
if (
    (@w1 := dayofweek(@day1 := '2016-05-01')) = 1,
    adddate(@day1, interval 1 day), 
    if(@w1 = 7, adddate(@day1, interval 2 day), @day1)
) day_one,
if (
    (@w2 := dayofweek(@day2 := last_day(@day1))) = 1,
    adddate(@day2, interval -2 day), 
    if(@w2 = 7, adddate(@day2,interval -1 day), @day2)
) day_last

简要说明:

  1. 如果第一天是星期日,请添加一天
  2. 如果第一天是星期六,请添加两天
  3. 给出一个月的任何一天,并获得该月的最后一天,

    1. 如果最后一天是星期日,减去两天
    2. 如果最后一天是星期六,减去一天