2011-03-11 91 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