确定每个月的第三个星期五

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 个工作日