我想问你我想在MYSQL中找到上个月的最后一个工作日。
怎么做 ?
此代码查找上个月的最后一天,如下所示:
LAST_DAY(Now()- INTERVAL 1 MONTH)
我需要的结果如下:
当前月份= 2013-07-01====> 结果应该是 2013-06-28
当前月份= 2013-06-06====> 结果应该是 2013-05-31
如何查找上个月的最后一个工作日?
问候
我想问你我想在MYSQL中找到上个月的最后一个工作日。
怎么做 ?
此代码查找上个月的最后一天,如下所示:
LAST_DAY(Now()- INTERVAL 1 MONTH)
我需要的结果如下:
当前月份= 2013-07-01====> 结果应该是 2013-06-28
当前月份= 2013-06-06====> 结果应该是 2013-05-31
如何查找上个月的最后一个工作日?
问候
这是我想到的一个例子:
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
可能有一种更优雅的写法(如果没有我会感到惊讶),但 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
+------------+
另一种方法是构建所有日期的日历表。忽略公共假期,该月的第一个和最后一个工作日只是该月的最小和最大工作日。
虽然,有一个论点是“所以为什么不在你的应用程序代码中弄清楚这一点”!
要获得最后工作日期,您必须遵循以下步骤: 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;
尝试类似:
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);
如果你减去当月的一天,那么你会得到上个月的最后一天
(DATE_SUB(CURDATE(),INTERVAL DAYOFMONTH(CURDATE()) DAY))
例如,在每月的 12 号,如果我们减去 12 天,那么就可以得到上个月的最后一天: