2011-03-11 95 views
2

Hallo。我怎样才能得到mysql当前月份的最后一个星期五的日期?MySQL的月份的最后一个星期五

在此先感谢。

编辑。嗨Stefan。这是我所做的

set @ldom = dayofweek(last_day(curdate())); 
select 
case 
when @ldom = 7 then last_day(curdate()) - interval 1 day 
when @ldom = 6 then last_day(curdate()) 
when @ldom = 5 then last_day(curdate()) - interval 6 day 
when @ldom = 4 then last_day(curdate()) - interval 5 day 
when @ldom = 3 then last_day(curdate()) - interval 4 day 
when @ldom = 2 then last_day(curdate()) - interval 3 day 
else last_day(curdate()) - interval 2 day 
end as last_friday 

但我想知道是否有更聪明的方法。

编辑。我在samplebias上做了一些测试,以找到特定月份的最后一个星期一,星期二等。

这些是正确的查询。

-- last sunday of month 
set @data = '2011-04-01'; 
select str_to_date(last_day(@data) - ((7 + weekday(last_day(@data)) - 6) % 7),"%Y%m%d") -- 2011-04-24 

-- last saturday 
set @data = '2011-04-01'; 
select str_to_date(last_day(@data) - ((7 + weekday(last_day(@data)) - 5) % 7),"%Y%m%d") -- 2011-04-30 

-- last friday 
set @data = '2011-04-01'; 
select str_to_date(last_day(@data) - ((7 + weekday(last_day(@data)) - 4) % 7),"%Y%m%d") -- 2011-04-29 

-- last thursday 
set @data = '2011-04-01'; 
select str_to_date(last_day(@data) - ((7 + weekday(last_day(@data)) - 3) % 7),"%Y%m%d") -- 2011-04-28 

-- last wednesday 
set @data = '2011-04-01'; 
select str_to_date(last_day(@data) - ((7 + weekday(last_day(@data)) - 2) % 7),"%Y%m%d") -- 2011-04-27 

-- last tuesday 
set @data = '2011-04-01'; 
select str_to_date(last_day(@data) - ((7 + weekday(last_day(@data)) - 1) % 7),"%Y%m%d") -- 2011-04-26 

-- last monday 
set @data = '2011-04-01'; 
select str_to_date(last_day(@data) - ((7 + weekday(last_day(@data))) % 7),"%Y%m%d") -- 2011-04-25 

希望它可以帮助别人。 再次感谢samplebias。 ;)

+0

好吧,我不会为你完全解决它,但提示:选择月份的地区,按日期降序排序,在工作日使用where datepart并检查星期五。然后将其限制为1. – stefan 2011-03-11 01:33:47

回答

8

下面是一个简化版本仅使用日期的功能:

SELECT LAST_DAY(NOW()) - ((7 + WEEKDAY(LAST_DAY(NOW())) - 4) % 7); 

根据如何NOW()获取评估(每天一次或声明两次),你可能想还是把这个包在功能和存储结果为NOW()为一个变量,然后使用该变量作为LAST_DAY(var)调用,以避免在该月份在调用NOW()之间翻转的竞争条件。

+0

Hallo。非常感谢你。精彩的解决方案。我会研究它以理解它。我已经添加了str_to_date以在日期部分之间获取连字符。再次感谢:) – 2011-03-11 02:38:09

+0

谢谢,很高兴我可以帮助。 – samplebias 2011-03-11 03:30:09

+0

完美!答案 – 2013-04-05 17:09:54

1
-- Today is 05 April 2013 

-- Get Last Friday from MySQL 

SELECT DATE_FORMAT(LAST_DAY(NOW()) - ((7 + WEEKDAY(LAST_DAY(NOW())) - 4) % 7), '%Y-%m-%d') last_friday; 

-- Output 

last_friday 
------------- 
2013-04-26 
+0

此答案只是现有答案的格式化版本。有什么补充吗? – rgettman 2013-04-05 17:46:35

+0

@rgettman:只需添加DATE_FORMAT即可获得2013-04-26的输出结果 – 2013-04-05 18:11:59