【问题标题】:Get the first and last working day date of some month in MySQL在 MySQL 中获取某个月的第一个和最后一个工作日日期
【发布时间】:2016-01-28 00:10:35
【问题描述】:

非常相似 Get the first and last date of next month in MySQL,但我想在 MySQL 中获取某个月的第一个和最后一个工作日日期。在这里,工作日只是指周一~周五,或者 DAYOFWEEK(date) >= 2 和

例如(我选择了 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)

【问题讨论】:

  • 最明显的问题是:对您来说,工作日是什么?他们在世界各地都不一样
  • 我更新了问题。感谢您指出。

标签: mysql


【解决方案1】:

例如:

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

【讨论】:

  • 这也是一个聪明的方法——但要确保表格日历中没有缺一天
  • 是的。日历是一个包含所有日期的实用程序表。实际上,MySQL 可能不是最好的工具。而是在你的应用程序代码中解决这个问题,根本不需要数据库。
【解决方案2】:

这里有一些伪代码来开始思考这个问题。对于月初(结束)检查一个工作日,如果没有则提前(备份)一天。重复测试并可能再次向前(向后)跳跃。您永远不必移动超过两次。

/* <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

【讨论】:

    【解决方案3】:

    在任何一个月的第一天喂第 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. 如果第一天是星期六,则增加两天

    给出一个月的任何一天,并得到该月的最后一天,

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-29
      • 2013-06-23
      • 2022-06-10
      • 1970-01-01
      • 2021-03-22
      • 1970-01-01
      • 2013-02-09
      • 1970-01-01
      相关资源
      最近更新 更多