2017-02-22 20 views
0

与えられた開始日に基づいてカスタムのFort Night期間を取得したい。 私はこのようになりますテーブルを持っている:SQL - カスタム開始日に2週間ごとの終了日を生成する

IF OBJECT_ID('tempdb..#tbl1') IS NOT NULL DROP TABLE #tbl1 
SET DATEFIRST 1 
DECLARE @StartDateTime DATETIME 
DECLARE @EndDateTime DATETIME 

SET @StartDateTime = '2016-09-03' 
SET @EndDateTime = '2017-01-28'; 

WITH DateRange(DateData) AS 
(
    SELECT @StartDateTime as Date 
    UNION ALL 
    SELECT DATEADD(d,1,DateData) 
    FROM DateRange 
    WHERE DateData < @EndDateTime 
) 
SELECT ROW_NUMBER() OVER(ORDER BY DateData ASC) As ROWNum,DateData AS Date1 
into #tbl1 
FROM DateRange 
OPTION (MAXRECURSION 0) 
GO 

SELECT top 10 * FROM #tbl1 

     Date1 
     2016-09-09 00:00:00.000 
     2016-09-10 00:00:00.000 
     2016-09-11 00:00:00.000 
     2016-09-12 00:00:00.000 
     2016-09-13 00:00:00.000 
     2016-09-14 00:00:00.000 
     2016-09-15 00:00:00.000 
     2016-09-16 00:00:00.000 
     2016-09-17 00:00:00.000 
     2016-09-18 00:00:00.000 
     2016-09-19 00:00:00.000 
     2016-09-20 00:00:00.000 
     2016-09-21 00:00:00.000 
     2016-09-22 00:00:00.000 

私は隔週の期間の最初の日は2016年9月9日であり、それは2016年9月22日に終了言いたいです。これらの日付ごとに隔週終了日を取得するにはどうすればよいですか。

だから私は、私は、SQL Serverに2005

ANSWER使用していることが

  Date1       FortNightEndDate 
     2016-09-09 00:00:00.000  2016-09-22 00:00:00.000 
     2016-09-10 00:00:00.000  2016-09-22 00:00:00.000 
     2016-09-11 00:00:00.000  2016-09-22 00:00:00.000 
     2016-09-12 00:00:00.000  2016-09-22 00:00:00.000 
     2016-09-13 00:00:00.000  2016-09-22 00:00:00.000 
     2016-09-14 00:00:00.000  2016-09-22 00:00:00.000 
     2016-09-15 00:00:00.000  2016-09-22 00:00:00.000 
     2016-09-16 00:00:00.000  2016-09-22 00:00:00.000 
     2016-09-17 00:00:00.000  2016-09-22 00:00:00.000 
     2016-09-18 00:00:00.000  2016-09-22 00:00:00.000 
     2016-09-19 00:00:00.000  2016-09-22 00:00:00.000 
     2016-09-20 00:00:00.000  2016-09-22 00:00:00.000 
     2016-09-21 00:00:00.000  2016-09-22 00:00:00.000 
     2016-09-22 00:00:00.000  2016-09-22 00:00:00.000 

見えるようにしたい:私は次のコードを使用してそれを解決することができた を。 StartDates EndDates InbetweenDatesスタート/ EndDatesテーブルがちょうど開始と私の2週間の期間の終了とID(行番号)を持っていた

InbetweenDatesテーブルは間のすべての日付を持っていた:基本的に私はちょうど3つのテーブルを作成しました2つの日付とID列を持っていましたが、1行ごとに上がるのではなく、14行ごとに1つ上になりました。 次に、3つのテーブルを結合しました。基本的にStart/EndDatesテーブルはルックアップテーブルでした。 私はから14日ごとのコードにRowNumberを取得しました。

-- BEtween Dates 
IF OBJECT_ID('tempdb..#BetweenDates') IS NOT NULL DROP TABLE #BetweenDates 
DECLARE @StartDateTime DATETIME 
DECLARE @EndDateTime DATETIME 

SET @StartDateTime = '2016-09-09' 
SET @EndDateTime = '2017-04-30'; 

WITH DateRange(DateData) AS 
(
    SELECT @StartDateTime as Date 
    UNION ALL 
    SELECT DATEADD(d,1,DateData) 
    FROM DateRange 
    WHERE DateData < @EndDateTime 
) 
SELECT 
    DateData 
into #BetweenDates 
FROM DateRange 
OPTION (MAXRECURSION 0) 
GO 



select 
    (case when convert(int, (ROW_NUMBER() OVER (Order by (select 0)) % 14))=0 then 0 else 1 end) 
    + convert(int, (ROW_NUMBER() OVER (Order by (select 0))/14)) as ID 
    ,DateData 
INTO #BetweenDates_ID 
from #BetweenDates 


-- Start Dates 

IF OBJECT_ID('tempdb..#StartDates') IS NOT NULL DROP TABLE #StartDates 
DECLARE @StartDateTime DATETIME 
DECLARE @EndDateTime DATETIME 

SET @StartDateTime = '2016-09-09' 
SET @EndDateTime = '2017-04-30'; 

WITH DateRange(DateData) AS 
(
    SELECT @StartDateTime as Date 
    UNION ALL 
    SELECT DATEADD(d,14,DateData) 
    FROM DateRange 
    WHERE DateData < @EndDateTime 
) 
SELECT ROW_NUMBER() OVER(ORDER BY DateData ASC) As ID,DateData 
into #StartDates 
FROM DateRange 
OPTION (MAXRECURSION 0) 
GO 

-- End Dates 

IF OBJECT_ID('tempdb..#EndDates') IS NOT NULL DROP TABLE #EndDates 
DECLARE @StartDateTime DATETIME 
DECLARE @EndDateTime DATETIME 

SET @StartDateTime = '2016-09-22' 
SET @EndDateTime = '2017-04-30'; 

WITH DateRange(DateData) AS 
(
    SELECT @StartDateTime as Date 
    UNION ALL 
    SELECT DATEADD(d,14,DateData) 
    FROM DateRange 
    WHERE DateData < @EndDateTime 
) 
SELECT ROW_NUMBER() OVER(ORDER BY DateData ASC) As ID,DateData 
into #EndDates 
FROM DateRange 
OPTION (MAXRECURSION 0) 
GO 


--SELECT * FROM #StartDates 
--SELECT * FROM #EndDates 
--SELECT * FROM #BetweenDates_ID 

SELECT 
    st.DateData AS StartDate 
    ,ed.DateData AS EndDate 
    ,bd.DateData AS BetweenDate 
FROM 
    #StartDates st 
    JOIN 
    #EndDates ed 
    ON st.ID = ed.ID 
    LEFT JOIN 
    #BetweenDates_ID bd 
    ON st.ID = bd.ID 
+0

隔週終了日は何ですか?どのように計算しますか? – PeterRing

+0

基本的に私は水曜日からThur(2週間)までの2週間の終了日が必要です。この例では、2016-09-09から2016-09-22までのすべての日付が2週間の終了日に属します。2016-09-22 – jmich738

答えて

0

これを試してみてください:

SELECT Date1, 
     DATEADD(DD, -1, DATEADD(WW,2,Date1)) AS FortNightEndDate 
FROM #tbl1 
+0

これは機能しません。それは各日付に2週間を追加します。私は要塞の夜の終了日を取得する必要があります。週末または月末の終了日と同じです。たとえば、2016-09-05〜2016-09-011(y/m/d)はすべて2016-09-11(週開始月)の週に属していることがわかります。私は同じことが必要ですが、Thurで始まる2週間 – jmich738

関連する問題