繁体   English   中英

在SQL Server中获取每第n个月的第n个工作日日期

[英]Get nth weekday date of every nth month in SQL Server

我需要知道SQL Server中每第n个月的第n个工作日日期。 例如,我需要从2015年1月1日到2015年12月30日的第二个星期一的所有日期。它是获取工作日的日期。 例如日期范围内每3个月的第一个星期一或第3个星期二。

前段时间我在这里回答了另一个问题: https : //stackoverflow.com/a/32474751/5089204

简而言之:创建一个带有运行编号的表(-> Tally表)。 这样的桌子在很多情况下都非常漂亮-无论如何都应该有这样的东西...虽然并不需要很多,但可以肯定会为您提供帮助...

从该表中,您可以通过简单的“选择”获得所有需要的数据。 也许您必须添加更多列并填充它们才能轻松获取数据。 但这不应该是一个问题...

这将是结果(深入到2173年)

Number  CalendarDate    CalendarYear    CalendarMonth   CalendarDay CalendarWeek    CalendarYearDay CalendarWeekDay
0       1900-01-01      1900            1               1           1               1               1
1       1900-01-02      1900            1               2           1               2               2
2       1900-01-03      1900            1               3           1               3               3
3       1900-01-04      1900            1               4           1               4               4
4       1900-01-05      1900            1               5           1               5               5
5       1900-01-06      1900            1               6           1               6               6

为了提高性能,设置索引会很好!

例如,应返回所有第三个星期二:

;WITH AllDates AS (
    SELECT CAST('2015' + Mnth + Dy AS date) AS Dt
    FROM (
        SELECT '01' AS Mnth UNION SELECT '02' UNION SELECT '03' UNION SELECT '04' 
        UNION SELECT '05' UNION SELECT '06' UNION SELECT '07' UNION SELECT '08' 
        UNION SELECT '09' UNION SELECT '10' UNION SELECT '11' UNION SELECT '12'
    ) AS Mnths
    CROSS JOIN (
        SELECT '01' AS Dy UNION SELECT '02' UNION SELECT '03' UNION SELECT '04' 
        UNION SELECT '05' UNION SELECT '06' UNION SELECT '07' UNION SELECT '08' 
        UNION SELECT '09' UNION SELECT '10' UNION SELECT '11' UNION SELECT '12'
        UNION SELECT '13' UNION SELECT '14' UNION SELECT '15' UNION SELECT '16'
        UNION SELECT '17' UNION SELECT '18' UNION SELECT '19' UNION SELECT '20'
        UNION SELECT '21' UNION SELECT '22' UNION SELECT '23' UNION SELECT '24'
        UNION SELECT '25' UNION SELECT '26' UNION SELECT '27' UNION SELECT '28'
        UNION SELECT '29' UNION SELECT '30' UNION SELECT '31'
    ) AS Dys
    WHERE ISDATE('2015' + Mnth + Dy) = 1
), AllDatesWithInfo AS (
    SELECT Dt, DATENAME(weekday, Dt) AS WeekDay, ROW_NUMBER() OVER (PARTITION BY YEAR(Dt), MONTH(Dt), DATENAME(weekday, Dt) ORDER BY Dt) AS NumberOfThisWeekDayInMonth
    FROM AllDates
)
SELECT *
FROM AllDatesWithInfo
WHERE WeekDay = 'Tuesday'
AND NumberOfThisWeekDayInMonth = 3
ORDER BY Dt

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM