我需要触发通知。这个通知必须每个月的第三个星期一触发。如何使用SQL语句计算每个月的第三个星期一?
回答
尝试使用dayofweek和dayofmonth函数。 http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_dayofweek
不知怎的,你可以检查多少个星期,从本月1日在那里CURDATE()与DAYOFMONTH(使用操作国防部7),和星期几应该是5日(星期四)
日期
SELECT date_add(date_sub(curdate(),INTERVAL dayofmonth(curdate())-1 DAY),
INTERVAL (7-weekday(date_sub(curdate(),INTERVAL dayofmonth(curdate())-1 DAY)))+14 DAY)
SELECT
(
DAYOFWEEK(NOW()) = 2
AND
DAYOFMONTH(NOW()) BETWEEN 15 AND 21
)
AS send_notice_today;
说我采用的方法是获得第一蒙德:当前月份的第三个星期一将由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
这一个计算给定年 - 月 - 日
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指点我们走向了答案。
这是一个不使用DAYOFWEEK
或DAYOFMONTH
的答案。它仅使用DATEADD
和DATEPART
。
我们需要两个辅助功能:
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
,保持内0
和6
答案。例如,只是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这个答案的第二个任期。
如果@firstday
是一个月
select date_add(@firstday,
interval (if(weekday(@firstday)>0,21-weekday(@firstday),14)) day);
的第一天得到这个月的第三个星期一。
与2018年
所有月份测试似乎比以前的解决方案更简单。
关键是星期几的if函数。
如果平日= 0(第一天是星期一),加14天 如果平日> 0,增加21天,减去平日
- 1. 如何在C#计算出每月的第二个星期五
- 2. strtotime认为“下个月的第一个星期日”=星期三?
- 3. 计算每年2月第一个星期天开始的第一周
- 4. 如何获得“每个月的第一个星期四”的DatePeriod?
- 5. 获取每个11月的第四个星期三R
- 6. 禁用每个月的第一个星期三的东西 - jQuery的?
- 7. 如何在每个月的第一个星期几安排SQL代理作业?
- 8. 仅启用第一和第三个星期三每个月在引导日期选择器
- 9. 计算一个月内的星期数,包括部分星期
- 10. Golang Revel Job spec每个月的第一个星期一
- 11. node-schedule每个月的第一个星期一运行
- 12. 找到第三个星期日每个月给两个日期之间
- 13. 计算每个星期的日期
- 14. 如何使用PHP检查本月的第一个星期六?
- 15. 如何获得一个月的第一个星期一?
- 16. Schedule Cron跳过每个月的第一个星期六
- 17. 使用NSCalendar - 获取下一个月的第一个星期二
- 18. Quartzscheduler在月份的第一个和第三个星期一运行
- 19. 如何计算当月的星期日?
- 20. 如何让每个月的第二个星期天在两个日期之间?
- 21. Cron表达式:该月的第三个星期一之后的第一个星期五
- 22. 回声每月第三个星期四开始2016年3月3日
- 23. 获取一个月的每个第二个星期二的日期
- 24. 得到的天数在每月的第一个星期在PHP
- 25. 如何使用SQL计算每月的保留月份
- 26. 只选择每个月的第四个星期天
- 27. 本月的第一个[星期一],本月的第二个[星期四]等。德尔福
- 28. 如何用红宝石计算一个日期的星期几?
- 29. 如何计算下个月的日期?
- 30. 谷歌应用脚本触发每个月的第一个星期四
只是想想,但不会有任何DAYOFMONTH 15天之间21(均包括在内)是相关月份第三天的第三次发生? – Monolo 2012-01-12 13:06:53
是的,我想你是对的。因此,解决方案是在15和21之间的每个星期一的时候获得第5周的日数。 – de3 2012-01-12 16:05:05