emc*_*cor 16 sql-server date-format sql-server-2012 date
我需要确定 SQL Server 中日期范围“1.1.1996 - 30.8.2014”的“每个月的第三个星期五”的日期。
我希望我应该使用的组合DENSE_RANK(),并PARTITION BY()以一套“等级= 3”。但是,我是 SQL 新手,无法找到正确的代码。
Phi*_*lᵀᴹ 27
鉴于:
本月的第三个星期五总是在本月的 15 日至 21 日之间
select thedate
from yourtable
where datename(weekday, thedate) = 'Friday'
and datepart(day, thedate)>=15 and datepart(day, thedate)<=21;
Run Code Online (Sandbox Code Playgroud)您也可以使用weekdaywith datepart(),但使用名称 IMO 更具可读性。字符串比较显然会更慢。
spa*_*dba 14
为了获得独立于语言/文化的答案,您需要考虑不同的工作日名称和一周的开始。
在意大利,星期五是“Venerdì”,一周的第一天是星期一,而不是像美国那样的星期日。
1900-01-01 是星期一,因此我们可以使用此信息以独立于语言环境的方式计算工作日:
WITH dates AS (
SELECT DATEADD(day, number, GETDATE()) AS theDate
FROM master.dbo.spt_values
WHERE type = 'P'
)
SELECT theDate, DATENAME(dw, theDate), DATEPART(dw, theDate)
FROM dates
WHERE DATEDIFF(day, '19000101', theDate) % 7 = 4
AND DATEPART(day, thedate)>=15 and DATEPART(day, thedate)<=21;
Run Code Online (Sandbox Code Playgroud)
ype*_*eᵀᴹ 12
另一种方式,使用 Phil 的答案作为基础,并处理不同的设置:
select thedate
from yourtable
where (datepart(weekday, thedate) + @@DATEFIRST - 2) % 7 + 1 = 5 -- 5 -> Friday
and (datepart(day, thedate) - 1) / 7 + 1 = 3 ; -- 3 -> 3rd week
Run Code Online (Sandbox Code Playgroud)
该5代码(如果你想星期五以外工作日)应该是(为同一SET DATEFIRST代码):
1 for Monday
2 for Tuesday
3 for Wednesday
4 for Thursday
5 for Friday
6 for Saturday
7 for Sunday
Run Code Online (Sandbox Code Playgroud)
面对语言设置,您也可以只使用“已知良好”日期来确保安全。例如,如果要查找星期五,请查看日历并查看 2015 年 1 月 2 日是星期五。然后可以将第一个比较写为:
DATEPART(weekday,thedate) = DATEPART(weekday,'20150102') --Any Friday
Run Code Online (Sandbox Code Playgroud)
另请参阅Peter Larsson如何获得一个月的第 N 个工作日。