如何用SQL根据NoOfDays字段生成对应10天区间的DateRange列
基于NoOfDays生成区间式DateRange的SQL实现
需求说明:
- 根据
NoOfDays字段生成对应的日期范围区间DateRange,规则为每10天一个区间:- NoOfDays = 70 → DateRange = 61-70
- NoOfDays = 51 → DateRange = 51-60
- NoOfDays = 100 → DateRange = 91-100
- NoOfDays = 174 → DateRange = 171-180
当前代码问题:
原代码中@V_START和@V_END是固定值,无法根据NoOfDays动态生成区间,需要替换为基于NoOfDays的计算逻辑。
修改后的SQL代码:
SELECT GETDATE() AS CurrentDate, TASK_ASSIGNED_DTM, DATEDIFF(DAY, TASK_ASSIGNED_DTM, GETDATE()) AS NoOfDays, -- 动态计算区间起始和结束值 CAST( ((DATEDIFF(DAY, TASK_ASSIGNED_DTM, GETDATE()) - 1) / 10) * 10 + 1 AS VARCHAR(10)) + '-' + CAST( ((DATEDIFF(DAY, TASK_ASSIGNED_DTM, GETDATE()) - 1) / 10) * 10 + 10 AS VARCHAR(10)) AS DateRange FROM [Table]
逻辑解释:
- 计算区间起始值:
((NoOfDays - 1) / 10) * 10 + 1- 用
NoOfDays - 1后做整数除法(SQL中整数除法会截断小数),得到区间的十位基数,再乘以10加1得到区间起始。 - 例:NoOfDays=70 → (70-1)/10=6 → 6*10+1=61
- 用
- 计算区间结束值:
((NoOfDays - 1) / 10) * 10 + 10- 基于同样的基数,加10得到区间结束。
- 例:NoOfDays=70 → 6*10+10=70
如果想简化代码,避免重复计算NoOfDays,可以用CTE提取中间结果:
WITH TaskDays AS ( SELECT GETDATE() AS CurrentDate, TASK_ASSIGNED_DTM, DATEDIFF(DAY, TASK_ASSIGNED_DTM, GETDATE()) AS NoOfDays FROM [Table] ) SELECT CurrentDate, TASK_ASSIGNED_DTM, NoOfDays, CAST( ((NoOfDays - 1) / 10) * 10 + 1 AS VARCHAR(10)) + '-' + CAST( ((NoOfDays - 1) / 10) * 10 + 10 AS VARCHAR(10)) AS DateRange FROM TaskDays
内容的提问来源于stack exchange,提问作者Lim
相关产品推荐
相关产品推荐

