2012-01-12 158 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天,减去平日

相关问题