首页 > 解决方案 > SQL 将日期转换为工作日名称

问题描述

我在 SQL Server 中工作,我有一个这样的表;

我的桌子

我想要达到的目标;我正在整理一份最常请病假的清单。我需要将 [病假开始日期] 列转换为一周中的某一天。我使用DATENAME(day, GETDATE()).

这适用于获取用户第一次生病的星期几 - 但是在 [Total Days Off] 大于 1 的情况下,我需要遍历每个日期并存储日期名称。

因此,我希望实现以下目标;

期望的结果

任何指针将不胜感激!

标签: sqlsql-serverdate

解决方案


首先生成您的生病日期范围,然后加入一个日历表(我在这里递归生成一个)并按每天的名称分组。

;WITH RecursiveCalendar AS
(
    SELECT
        GeneratedDate = CONVERT(DATE, '2018-01-01')

    UNION ALL

    SELECT
        GeneratedDate = DATEADD(DAY, 1, C.GeneratedDate)
    FROM
        RecursiveCalendar AS C
    WHERE
        C.GeneratedDate < '2019-01-01'
),
SickRanges AS
(
    SELECT
        S.StartDate,
        EndDate = DATEADD(DAY, CEILING(S.DaysOff) - 1, S.StartDate)
    FROM
        YourTable AS S
)
SELECT
    Weekday = DATENAME(WEEKDAY, C.GeneratedDate),
    AmountSickDays = COUNT(1)
FROM
    SickRanges AS R
    INNER JOIN RecursiveCalendar AS C ON C.GeneratedDate BETWEEN R.StartDate AND R.EndDate
GROUP BY
    DATENAME(WEEKDAY, C.GeneratedDate)
ORDER BY
    COUNT(1) DESC
OPTION
    (MAXRECURSION 30000)

在第二个 CTE 上替换您的表和列以运行。


推荐阅读