2017-01-18 4 views
0

入力は、myTbl.StartDateおよびmyTbl.EndDate列の値に格納されるメインの日付範囲です。 分周器として与えられた一定値の場合、メイン日付範囲を一定値の長さのサブ日付範囲に分割して得られたサブ日付範囲の開始日を計算する必要があります。 例は最良の説明です:「2017年1月22日」とconst_val = 6出力に「2017年1月1日」の間の主な日付範囲の は次のとおりです。SQL Serverの指定されたメイン日付範囲のサブ日付範囲の開始日を計算します

2017-1-1 
    2017-1-7 (1 + 6) 
    2017-1-13 (7 + 6) 
    2017-1-19 (13 + 6) 

SQLのユーザーが管理者ではないことをその顕著(私はシステムテーブルを使用することはできません)

+0

まず、使用しているdbmsにタグを付けることができれば(たとえそれがSQL Serverだとしても)、素晴らしいことです。しかし別の質問:あなたはカレンダーテーブルを持っていますか? DimDateかこれに似たもの?また、別のこと:単一のクエリにする必要があるのでしょうか、ループを使うことができますか? – Tyron78

+0

期待した結果を示してください。 – McNets

+0

期待される結果は上にリストされています:2017-01-01、2017-01-07、2017-01-13、2017-01-19 – Tyron78

答えて

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 

それWHEREの条件が満たされるまで、UNION ALLで6日間を追加します。

+0

私のソリューションとほとんど同じように見えます。 :-) – Tyron78

+1

私のコメントをチェックしてもそれほどではありません;) – Tanner

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 

しかし、代わりに私が変数に割り当てられた固定日付の、単にあなたの開始日と終了日の列で変数を交換し、 cte accordiを拡張する悲しい。

+1

あなたは 'DATEADD'の' @FixDateDiff 'より簡単な解決策のためには、WHERE句を使用してください。 – Tanner

+0

はい、そうです。 Mea culpa。 ;-) – Tyron78