编写SQL实现周五至周一同组的TheResult日期计数逻辑
实现逻辑
将日期按「周二到下周一」划分为7天的独立计数周期,每个周期计数共增长4:
- 周期内周二、周三、周四各对应1个独立计数增量
- 周五、周六、周日、周一归为同一计数桶,共享1个计数值
计数从当前日期(GETDATE()转为纯日期类型)开始,初始值为0。
SQL Server 实现代码
代码做了周计算兼容,不受数据库默认周起始(DATEFIRST)配置影响:
-- 测试示例时可将@StartDate赋值为'2022-06-07',生产环境使用CAST(GETDATE() AS DATE)即可 DECLARE @StartDate DATE = CAST(GETDATE() AS DATE); SELECT TheDate, DATENAME(WEEKDAY, TheDate) AS TheDayName, (DATEDIFF(DAY, @StartDate, TheDate) / 7) * 4 + CASE WHEN week_day = 2 THEN 0 WHEN week_day = 3 THEN 1 WHEN week_day = 4 THEN 2 ELSE 3 END AS TheResult FROM ( SELECT TheDate, -- 标准化周几计算:返回值1=周一、2=周二……7=周日,不受默认周起始配置影响 (DATEPART(WEEKDAY, TheDate) + @@DATEFIRST - 2) % 7 + 1 AS week_day FROM Your_Table_Name -- 替换为实际存储日期的表名 ) t -- 测试示例可放开下方过滤条件 -- WHERE TheDate BETWEEN '2022-06-07' AND '2022-06-21'
验证结果
以示例给出的起始日2022-06-07测试,返回值完全匹配示例规则:
- 首个周期(2022-06-07至2022-06-13):周二为0、周三为1、周四为2,周五至周一均为3
- 第二个周期(2022-06-14至2022-06-20):周二为4、周三为5、周四为6,周五至周一均为7
- 第三个周期起始日(2022-06-21,周二):返回值8
内容的提问来源于stack exchange,提问作者Nicholas5280
相关产品推荐
相关产品推荐

