2017-02-22 2 views
0

Ich möchte einen benutzerdefinierten Fort-Nacht-Zeitraum basierend auf einem bestimmten Startdatum erhalten. Ich habe eine Tabelle, die wie folgt aussieht:SQL - Generieren Sie zweiwöchentliches Enddatum am benutzerdefinierten Startdatum

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 

ich das das erste Datum meiner zwei Wochen Zeit sagen will 2016.09.09 ist, und es endet 2016.09.22. Wie erhalte ich ein zweiwöchiges Enddatum für jedes dieser Daten?

So will ich es wie

  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 

I SQL Server 2005.

ANTWORT bin mit aussehen: Ich konnte es lösen mit dem folgenden Code. Ich habe nur 3 Tische im Wesentlichen: Startdaten EndDates InbetweenDates

Die Start/EndDates Tabellen hatte nur den Anfang und das Ende meiner Zeitraum von 2 Wochen und eine ID (Zeilennummer) Die InbetweenDates Tisch hatten alle die Daten zwischen den 2 Dates und hatte auch eine ID-Spalte, aber statt 1 in jeder Zeile ging es 1 alle 14 Zeilen. Dann habe ich gerade die 3 Tabellen beigetreten. Im Wesentlichen waren die Start/EndDates-Tabellen Nachschlagetabellen. Ich habe die RowNumber an jedem 14 Tage Code von 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

Was ist alle zwei Wochen Enddatum? Wie berechnen Sie es? – PeterRing

+0

Im Wesentlichen brauche ich zwei Wochen Enddatum von Mi bis Do (2 Wochen). In diesem Beispiel gehören alle Daten vom 2016-09-09 bis zum 2016-09-22 zum zweizehntägigen Enddatum 2016-09-22 – jmich738

Antwort

0

Versuchen Sie folgendes:

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

Das funktioniert nicht. Es fügt 2 Wochen zu jedem Datum hinzu. Ich muss Fort Nachtenddatum bekommen. Genauso wie Sie ein Enddatum für eine Woche oder ein Monatsenddatum erhalten würden. Zum Beispiel würde es wissen, dass 2016-09-05 bis 2016-09-011 (J/M/T) alle zur Woche enden 2016-09-11 (Woche beginnt Mo). Ich brauche das gleiche aber für 2 Wochen auf einer Thur – jmich738

Verwandte Themen