SQL:获得第二个完整周的星期五

时间:2017-12-12 15:13:06

标签: sql sql-server tsql sql-server-2016 date-arithmetic

这是一个有趣的方程式。我正在寻找最简洁的方法来检索每个月的第二个完整周五。假设一周从星期一开始。

实施例

  • 2017年11月将是 17th
  • 2017年12月将是 15th
  • 2018年1月将是第12次

这些东西通常很有趣,但我现在感觉不舒服。有什么建议吗?

3 个答案:

答案 0 :(得分:3)

起初这可能不容易理解,但对于这个具体案例,规则很简单:

weekday = 'Friday' (or whichever way to determine if this day is Friday)
and day_of_month between 12 and 18

如果星期一开始,这将有效。

答案 1 :(得分:1)

如果工作周在星期一开始,那么一个月的第二个完整工作周的星期五是

SELECT DATEADD(day, (9 - DATEPART(weekday, @fdom)) % 7) + 11, @fdom)
       AS SecondWorkweekFriday;

-- 1. start with the first day of the month (@fdom)
-- 2. advance to the nearest Monday with modular arithmetic
--    n.b.: by default DATEPART considers Monday to be ordinal
--          week day #2, thus "7 - DATEPART() + 2" becomes
--          "9 - DATEPART"
-- 3. add eleven days to get to the second Friday thereafter

其中 @fdom 是该月的第一天。有很多方法可以在SQL中找到first day of the month

答案 2 :(得分:0)

我个人喜欢这样的日期表,但你也可以算出来:

%A4%FD

可能需要调整CASE WHEN datepart(weekday, '2017-12-01')<=5 THEN 7 ELSE 14 END + (7-datepart(weekday, '2017-12-01')) ,但我认为这是正确的,因为5是基于星期日的,你是基于星期一的(可能需要6才能正确抵消)。

无论如何,这应该让你进入球场。