2017-02-22 132 views
0

我想根據給定開始日期獲取自定義Fort Night時間段。 我有一個表,看起來像這樣:SQL - 在自定義開始日期生成雙週結束日期

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日。我如何獲得每個日期的雙週結束日期。

所以我希望它看起來像

  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 

我使用的是SQL Server 2005中

答: 我可以使用下面的代碼來解決它。基本上我剛剛創建3個表: StartDates EndDates InbetweenDates

開始/ EndDates表剛開始和我的2周時間的結束和一個ID(行號) 的InbetweenDates表有所有的日期2個日期,並且還有一個ID列,但不是每行增加1個,每14行增加1個。 然後我剛加入了3張桌子。基本上,Start/EndDates表是查找表。 我從here開始每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

本質上我需要從週三到週四(2周)的兩週結束日期。在此示例中,2016-09-09至2016-09-22的所有日期都屬於兩週結束日期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(年/月/日)都屬於2016年9月11日結束的一週(星期一開始的星期一)。我需要同樣的事情,但在週四開始的兩週內 – jmich738

相關問題