2015-12-09 64 views
1

每n个月的第n个工作日的日期,我需要知道在SQL Server中每隔n个月的第n个工作日的日期。例如,我需要从2015年1月1日,第二日的所有日期至12月30日,2015年 它是让平日日期。如第一个星期一或第三个星期二的第三个月之间的日期范围。获取在SQL Server

+0

这被标记为重复,但问题是关于这个月的日子里,没有工作日。 –

+0

嗨Awadesh,那将是非常客气这里看看。 [someone-answers](http://stackoverflow.com/help/someone-answers),thx! – Shnugo

回答

0

这应该例如,返回所有3星期二:

;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 
+0

如果有人知道一个更好的方式来获得“AllDates”虚表,我很想听听它... –

+0

你可能想看看,以我在我的答案提供的链接... – Shnugo

+0

这的确更少的代码它会产生更多的可能性。我会记住这一技巧,谢谢。 –

1

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

总之:创建一个流水号表( - >帐簿表) 。这种表是在许多情况下是非常帅气的 - 一个人应该有这样的事情反正...它并不需要很多,但它会帮助你肯定...

出此表,你可以得到所有需要的数据用简单的'SELECT'。也许你必须添加更多列并填充它们以轻松获取数据。但是,这不应该是一个问题...

这将是结果(深运行到今年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 

出于性能方面这将是很好设定指标!