【问题标题】:Return the working day number in each calendar month返回每个日历月的工作日数
【发布时间】:2021-12-18 13:08:49
【问题描述】:

我正在尝试计算每个日历月的工作日数。例如,在 11 月份,有 22 个工作日(1、2、3、...、22)。星期六和星期日将被视为前一个星期五(例如 11 月 1 日、2 日、3 日、4 日、5 日、5 日、5 日、6 日、7 日、8 日、9 日、10 日、10 日、10 日、11 日、...、22 日)。

我在下面写的逻辑不起作用。请问谁能帮我解决这个问题?

SELECT Date 
     , datepart(DW, DATE) AS DayName
     , DATENAME(DW, DATE) ax
     , datepart(DW, DATE)-1 AS DayName1
     , CASE WHEN datepart(DW,DATE)-1 IN (0,6) THEN 5 ELSE datepart(DW,DATE)-1 END bx
FROM [STAGING_4_6_DIM_CALENDAR_V2] 
ORDER BY 1 ASC

【问题讨论】:

  • 您当前的查询有什么问题?
  • case 语句返回这个输出,这不是我打算实现的 1 2 3 4 5 5 5 1 2 3 4 5 5 5
  • 您说Saturday and Sunday will be seen as the preceding Friday ...您当前的输出在我看来是正确的。
  • 虽然以上是特定于语言的。 WEEKDAY 根据您的@@DATEFIRST 设置返回不同的值,该设置与LOGIN 的语言设置相关联。就个人而言,由于您有一个日历表,我会将工作日编号存储在其中。
  • 当月 - 11 月的天数必须继续为第 22 天。但查询并没有这样做。

标签: sql date tsql sql-server-2008 calendar


【解决方案1】:
 SELECT S.[DATE]
    ,X.WeekDayNumber
    ,DATENAME(dw, [DATE]) AS ax
    ,5 * X.WeekOfMonth +
        CASE
            WHEN X.WeekDayNumber > 5
            THEN 5
            ELSE X.WeekDayNumber
        END
        - X.FirstDayOfMonthOffset AS bx
FROM [STAGING_4_6_DIM_CALENDAR_V2] S
    CROSS APPLY
    (
        VALUES
        (
            -- iso day of week regardless of locale
            (DATEPART(dw, [DATE])  + @@DATEFIRST + 5) % 7 + 1
            -- Zero based week of month
            ,DATEPART(iso_week, [DATE]) % 53
                - DATEPART(iso_week, DATEADD(day, 1, EOMONTH([DATE], -1))) % 53
            -- Zero based first day of month offset. Monday = 0 to Sunday =6
            ,(DATEPART(dw, DATEADD(day, 1, EOMONTH([DATE], -1)))  + @@DATEFIRST + 5) % 7
        )
    ) X (WeekDayNumber, WeekOfMonth, FirstDayOfMonthOffset)
ORDER BY [DATE];

【讨论】:

    【解决方案2】:

    我想你可以使用运行总和:

    WITH cte AS (
        SELECT Date
             , CASE WHEN DATENAME(WEEKDAY, Date) IN ('SATURDAY', 'SUNDAY') THEN 0 ELSE 1 END AS wd
        FROM t
    )
    SELECT Date, SUM(wd) OVER (PARTITION BY YEAR(Date), MONTH(Date) ORDER BY Date)
    FROM cte
    

    2021 年 11 月,它将返回:

    1,2,3,4,5,5,5,6,7,8,9,10,10,10,11,12,13,14,15,15,15,16,17,18,19,20,20,20,21,22
    

    【讨论】:

    • 谢谢。这对我有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    相关资源
    最近更新 更多