2012-01-12 152 views

回答

1

嘗試使用dayofweekdayofmonth函數。 http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_dayofweek

不知怎的,你可以檢查多少個星期,從本月1日在那裏CURDATE()與DAYOFMONTH(使用操作國防部7),和星期幾應該是5日(星期四)

+1

只是想想,但不會有任何DAYOFMONTH 15天之間21(均包括在內)是相關月份第三天的第三次發生? – Monolo 2012-01-12 13:06:53

+1

是的,我想你是對的。因此,解決方案是在15和21之間的每個星期一的時候獲得第5周的日數。 – de3 2012-01-12 16:05:05

0

日期

SELECT date_add(date_sub(curdate(),INTERVAL dayofmonth(curdate())-1 DAY), 
    INTERVAL (7-weekday(date_sub(curdate(),INTERVAL dayofmonth(curdate())-1 DAY)))+14 DAY) 
2
SELECT 
(
    DAYOFWEEK(NOW()) = 2 
    AND 
    DAYOFMONTH(NOW()) BETWEEN 15 AND 21 
) 
AS send_notice_today; 
0

說我採用的方法是獲得第一蒙德:當前月份的第三個星期一將由SQL語句給予每個月的月份,並根據月份的時間增加2或3周(因爲當它在星期一之前/之後摔倒時,您只需要再走2個星期):

;with 
filler as (select row_number() over (order by a) a from (select top 100 1 as a from syscolumns) a cross join (select top 100 1 as b from syscolumns) b), 
dates as (select dateadd(month, a-1, '1/1/1900') date from filler where a <= 2000), 
FirstMonday as (
select dateadd(day, case datepart(weekday,Date) 
          when 1 then 1 
          when 2 then 0 
          when 3 then 6 
          when 4 then 5 
          when 5 then 4 
          when 6 then 3 
          when 7 then 2 
         end, Date) as Date 
     ,case when datepart(weekday,Date) = 1 then 3 else 2 end as Weeks 
from dates 
) 
select dateadd(week, Weeks, Date) as ThirdMonday 
from FirstMonday 
0

這一個計算給定年 - 月 - 日

SET @firstday = '2015-04-01'; 
SELECT ADDDATE(@firstday , MOD((9-DAYOFWEEK(@firstday)),7)) as first_monday; 

這一個計算給定年 - 月 - 日

SET @firstday = '2015-01-01'; 
SELECT ADDDATE(@firstday , MOD((23-DAYOFWEEK(@firstday)),21)) as third_monday; 

這一個計算每月的第三個星期一每月的第一個星期一一個第三個星期五Ÿ每月給予年 - 月 - 日

SET @firstday = '2015-09-01'; 
SELECT ADDDATE(@firstday , MOD((20-DAYOFWEEK(@firstday)),20)) as third_friday; 

感謝@Brewal了原來的問題,並@ User2208436指點我們走向了答案。

0

這是一個不使用DAYOFWEEKDAYOFMONTH的答案。它僅使用DATEADDDATEPART

我們需要兩個輔助功能:

CREATE FUNCTION dbo.day_of_week(@date Date) 
RETURNS INT 
AS BEGIN 
    -- (1 for Sunday, 2 for Monday, etc) 
    RETURN DATEPART(dw, DATEADD(year, year(@date)-1900, DATEADD(month, month(@date)-1, DATEADD(day, day(@date)-1, 0)))) 
END 
GO 

CREATE FUNCTION dbo.date_from_parts(@year INT, @month INT, @day INT) 
RETURNS DATE 
AS BEGIN 
    RETURN DATEADD(year, @year-1900, DATEADD(month, @month-1, DATEADD(day, @day-1, 0))) 
END 
GO 

然後使用下面的示例數據:

DECLARE @day_of_week INT 
SET @day_of_week = 2 -- Monday 

DECLARE @year INT 
DECLARE @month INT 
SET @year = 2016 
SET @month = 11 

讓我們先來獲得這個月的第一個星期一:

我們將增加一個抵消,(day_of_week - day of week of first day of the month) % 7,到月的第一天。

(另請注意,我們需要的,而不是僅僅x % 7建設((x % n) + n) % n,保持內06答案。例如,只是SELECT -3 % 7回報-3!見Mod negative numbers in SQL just like excel

現在,這裏的最終建設取得第一這個月的星期一:

SELECT 
    DATEADD(
     dd, 
     (((@day_of_week - 
      dbo.day_of_week(dbo.date_from_parts(@year, @month, 1))) % 7) + 7) % 7, 
     dbo.date_from_parts(@year, @month, 1) 
    ) 

爲了獲得這個月的第三個星期一,加14這個答案的第二個任期。

0

如果@firstday是一個月

select date_add(@firstday, 
     interval (if(weekday(@firstday)>0,21-weekday(@firstday),14)) day); 

的第一天得到這個月的第三個星期一。

與2018年

所有月份測試似乎比以前的解決方案更簡單。

關鍵是星期幾的if函數。

如果平日= 0(第一天是星期一),加14天 如果平日> 0,增加21天,減去平日

相關問題