1

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

怎么做 ?

此代码查找上个月的最后一天,如下所示:

LAST_DAY(Now()- INTERVAL 1 MONTH)

我需要的结果如下:

当前月份= 2013-07-01====> 结果应该是 2013-06-28

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

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

问候

4

5 回答 5

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
于 2013-07-07T08:22:59.630 回答
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 
 +------------+      

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

虽然,有一个论点是“所以为什么不在你的应用程序代码中弄清楚这一点”!

于 2013-07-07T07:25:45.083 回答
0

要获得最后工作日期,您必须遵循以下步骤: 1. 首先获得上个月的最后日期。2.通过工作日功能检查是否是工作日。如果是星期日,则从 lastdate 中减去 2,如果是星期六,则从 lastdate 中减去 1,否则不更改任何内容。

我们可以通过 case 语句来做这件事。检查以下查询。它真的会起作用:

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

于 2013-07-07T07:31:08.847 回答
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);
于 2013-07-07T07:42:53.067 回答
-2

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

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

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

于 2013-07-07T07:13:03.730 回答