从sql server中给定的主日期范围计算子日期范围的开始日期

时间:2017-01-18 09:55:30

标签: sql sql-server

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用户不是管理员(我不能使用系统表)

2 个答案:

答案 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条件。