2017-02-22 31 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-09-09 и заканчивается 2016-09-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 

Я использую 2005.

ANSWER SQL Server: Я был в состоянии решить эту проблему, используя следующий код. По сути, я только что создал 3 таблицы: StartDates EndDates InbetweenDates

В/EndDates таблицы Начало было только начало и конец моего 2 недели и идентификатор (номер строки) Таблица InbetweenDates имели все даты между 2, а также столбец идентификатора, но вместо того, чтобы подниматься на 1 строку, он увеличивался на 1 каждые 14 строк. Тогда я только что присоединился к трем таблицам. По сути, таблицы Start/EndDates были поисковыми таблицами. Я получил RowNumber на каждые 14 дней код от here.

-- 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 (y/m/d) принадлежат к концу недели 2016-09-11 (неделя начинается с Mon). Мне нужно то же самое, но в течение 2 недель, начиная с Thur – jmich738

 Смежные вопросы

  • Нет связанных вопросов^_^