非常相似 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)
答案 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
简要说明:
给出一个月的任何一天,并获得该月的最后一天,