我需要觸發通知。這個通知必須每個月的第三個星期一觸發。如何使用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