You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

SQL Server中如何转换病假日期为星期名并处理多病假天数

解决SQL Server中跨多天病假的星期名统计问题

嘿,这个需求我之前处理过类似的,核心就是把跨多天的病假拆成每一天,再统一统计星期名的出现频率。咱们一步步来实现:

1. 先纠正一个小误区

你提到用DATENAME(day, GETDATE())获取星期名,这里参数写错啦!day是用来提取日期中的“日”(比如15号),要获取星期名得用weekday参数,正确的写法是DATENAME(weekday, 你的日期字段)

2. 核心思路:拆分跨天病假为单个日期

[Total Days Off]大于1时,我们需要从[Sick Leave Start Date]开始,生成连续的日期序列(比如请假3天,就生成开始日、开始日+1天、开始日+2天这三个日期)。这里用递归CTE来生成数字序列,再和原始表关联生成所有病假日期。

3. 完整SQL代码实现

-- 第一步:生成数字序列,覆盖最大的请假天数
WITH NumberSequence AS (
    SELECT 0 AS Number
    UNION ALL
    SELECT Number + 1
    FROM NumberSequence
    WHERE Number + 1 <= (SELECT MAX([Total Days Off]) FROM YourTableName) -- 替换成你的表名
),
-- 第二步:生成所有病假对应的单个日期,并转换为星期名
SickLeaveDays AS (
    SELECT 
        DATENAME(weekday, DATEADD(day, ns.Number, sl.[Sick Leave Start Date])) AS WeekDayName
    FROM YourTableName sl -- 替换成你的表名
    JOIN NumberSequence ns ON ns.Number < sl.[Total Days Off]
    WHERE sl.[Total Days Off] > 0 -- 过滤无效的请假天数
)
-- 第三步:统计每个星期名的出现次数,按频率降序排列
SELECT 
    WeekDayName,
    COUNT(*) AS OccurrenceCount
FROM SickLeaveDays
GROUP BY WeekDayName
ORDER BY OccurrenceCount DESC;

4. 代码解释

  • NumberSequence:递归生成从0开始的数字,最大数字等于表中最长的请假天数,这样能覆盖所有跨天的情况。
  • SickLeaveDays:把原始表的每一条记录,和数字序列关联,生成每个请假日的日期,再用DATENAME(weekday, ...)转换为星期名。比如请假3天,就会生成3条对应的星期名记录。
  • 最后分组统计每个星期名的出现次数,按次数从高到低排序,就能直接看到最频繁的病假星期名了。

示例结果

假设你的表有以下数据:

Sick Leave Start DateTotal Days Off
2024-05-20(周一)2
2024-05-21(周二)1
2024-05-24(周五)3

执行代码后会得到:

WeekDayNameOccurrenceCount
Friday2
Monday1
Tuesday1
Saturday1
Sunday1

这样就能清晰看到最频繁的病假星期名啦!

内容的提问来源于stack exchange,提问作者Mark

火山引擎 最新活动