input是一个主日期范围,存储在myTbl.StartDate和myTbl.EndDate列值中。 对于作为分隔符的给定常量值,我需要计算从主日期范围除以具有恒定值长度的子日期范围获得的子日期范围的开始日期。 示例是最好的解释: 对于'2017-1-1'到'2017-1-22'之间的主日期范围和const_val = 6输出是:
2017-1-1
2017-1-7 (1 + 6)
2017-1-13 (7 + 6)
2017-1-19 (13 + 6)
值得注意的是SQL用户不是管理员(我不能使用系统表)
答案 0 :(得分:1)
您可以尝试以下操作:
DECLARE @StartDate DATE = CONVERT(date, '2017-01-01');
DECLARE @EndDate DATE = CONVERT(date, '2017-01-22');
DECLARE @FixDateDiff int = 6;
WITH cte AS (
SELECT @StartDate AS MyDate
UNION ALL
SELECT DATEADD(d, 1, MyDate)
FROM cte
WHERE DATEADD(d, 1, MyDate) <= CONVERT(date, @EndDate)
)
SELECT MyDate
FROM cte
WHERE DATEDIFF(d, @StartDate, MyDate)%@FixDateDiff = 0
但是,不是我分配给变量的固定日期,只需用StartDate和EndDate列替换变量,并相应地扩展cte。
答案 1 :(得分:1)
您可以使用递归cte来执行此操作:
DECLARE @startDate DATE = '20170101' ,
@endDate DATE = '20170122' ,
@Const_val INT = 6;
WITH cte
AS ( SELECT @startDate AS DateVal
UNION ALL
SELECT DATEADD(DAY, @Const_val, cte.DateVal)
FROM cte
WHERE DATEADD(DAY, @Const_val, cte.DateVal) <= @endDate
)
SELECT *
FROM cte;
产地:
DateVal
==========
2017-01-01
2017-01-07
2017-01-13
2017-01-19
cte的第一部分获得第一个日期:
SELECT @startDate AS DateVal
然后使用UNION ALL
添加6天,直到满足WHERE
条件。