卡住mysql找到上个月的最后一个工作日

时间:2013-07-07 07:06:47

标签: mysql

我想问你,我想在上个月的MYSQL中找到最后一个工作日。

怎么做?

此代码在上个月的最后一天发现如下:

LAST_DAY(Now()- INTERVAL 1 MONTH)

我需要的结果如下:

本月= 2013-07-01 ====>结果应该是2013-06-28

当月= 2013-06-06 ====>结果应该是2013-05-31

如何查找上个月的最后一个工作日?

此致

5 个答案:

答案 0 :(得分:1)

这是我想到的一个例子:

LAST_DAY(CURDATE() - INTERVAL 1 MONTH) -
INTERVAL (CASE WEEKDAY(LAST_DAY(CURDATE() - INTERVAL 1 MONTH))
          WHEN 5 THEN 1
          WHEN 6 THEN 2
          ELSE 0 END) DAY

答案 1 :(得分:0)

可能有更优雅的写作方式(如果没有,我会感到惊讶),但Gumbo的解决方案可能看起来像这样......

注意我已使用@dt进行测试。您只需在脚本中替换CURDATE()即可。

 SET @dt = '2012-07-01'; -- Last day of the previous month (June 2012) was a Saturday

 SELECT CASE DAYOFWEEK(LAST_DAY(@dt-INTERVAL 1 MONTH)) 
        WHEN 1 THEN LAST_DAY(@dt-INTERVAL 1 MONTH)-INTERVAL 2 DAY 
        WHEN 7 THEN LAST_DAY(@dt-INTERVAL 1 MONTH)-INTERVAL 1 DAY 
        ELSE LAST_DAY(@dt-INTERVAL 1 MONTH)
        END x;
 +------------+
 | x          |
 +------------+
 | 2012-06-29 | -- Friday 29th 
 +------------+


 SET @dt = '2012-08-01'; -- Last day of the previous month (July 2012) was a Tuesday

 SELECT CASE DAYOFWEEK(LAST_DAY(@dt-INTERVAL 1 MONTH)) 
        WHEN 1 THEN LAST_DAY(@dt-INTERVAL 1 MONTH)-INTERVAL 2 DAY 
        WHEN 7 THEN LAST_DAY(@dt-INTERVAL 1 MONTH)-INTERVAL 1 DAY 
        ELSE LAST_DAY(@dt-INTERVAL 1 MONTH)
        END x;
 +------------+
 | x          |
 +------------+
 | 2012-07-31 | -- Tuesday 31st
 +------------+

 SET @dt = '2012-10-01'; -- Last day of the previous month (September 2012) was a Sunday

 SELECT CASE DAYOFWEEK(LAST_DAY(@dt-INTERVAL 1 MONTH)) 
        WHEN 1 THEN LAST_DAY(@dt-INTERVAL 1 MONTH)-INTERVAL 2 DAY 
        WHEN 7 THEN LAST_DAY(@dt-INTERVAL 1 MONTH)-INTERVAL 1 DAY 
        ELSE LAST_DAY(@dt-INTERVAL 1 MONTH)
        END x;
 +------------+
 | x          |
 +------------+
 | 2012-09-28 | -- Friday 28th 
 +------------+      

另一种方法是构建所有日期的日历表。忽略公众假期,本月的第一个工作日和最后一个工作日只是该月的最低和最高工作日。

尽管如此,有一个论点是'那么为什么不在你的应用程序代码中弄清楚这一点'!

答案 2 :(得分:0)

要获得上一个工作日期,您必须按照以下步骤操作: 1.首先得到上个月的最后一个日期。 2.通过工作日功能检查是否工作日。如果它是星期日,则从lastdate减去2,如果是星期六,则从lastdate减1,否则不改变任何东西。

我们可以通过案例陈述来做这件事。检查以下查询。它真的有用:

SELECT 
CASE WEEKDAY(LAST_DAY(CONCAT(YEAR(CURDATE()),'-' , MONTH(CURDATE())-1 ,'-' , 1))) 
WHEN 6 
  THEN DATE_ADD(LAST_DAY(CONCAT(YEAR(CURDATE()),'-' , MONTH(CURDATE())-1 ,'-' , 1)),INTERVAL -2 DAY)
WHEN 5
  THEN DATE_ADD(LAST_DAY(CONCAT(YEAR(CURDATE()),'-' , MONTH(CURDATE())-1 ,'-' , 1)),INTERVAL - 1 DAY) 
ELSE 
  LAST_DAY(CONCAT(YEAR(CURDATE()),'-' , MONTH(CURDATE())-1 ,'-' , 1)) END;

http://sqlfiddle.com/#!2/d41d8/15940

答案 3 :(得分:0)

尝试类似:

SET @lastworkingday = DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE()) DAY);

// If saturday, take it back one day
IF DAYOFWEEK(@lastworkingday) = 7 
    THEN @lastworkingday := DATE_SUB(@lastworkingday, INTERVAL 1 DAY);
// If sunday, take it back two days
ELSE IF DAYOFWEEK(@lastworkingday) = 1
    THEN @lastworkingday := DATE_SUB(@lastworkingday, INTERVAL 2 DAY);

答案 4 :(得分:-2)

如果你减去当月的那天,那么你将获得上个月的最后一天

(DATE_SUB(CURDATE(),INTERVAL DAYOFMONTH(CURDATE()) DAY))

例如,如果我们减去12天,那么在本月12日,那么就可以获得上个月的最后一天: