2017-12-20 12 views
0

enter image description here Ich habe akademischen Begriff Beginn und Ende Daten für jeden Begriff (Frühling, Sommer, Herbst) für akademische Jahre von 1975 bis 2020 in D_Term Dimension. Zum Beispiel:Akademischer Ausdruck Beginn und Ende Daten

2017-01-16 to 2017-05-18 (Spring) 
2017-06-05 to 2017-08-04 (Summer) 
2017-08-24 to 2017-12-20 (Fall) 

Mein aktuelles Problem ist, dass ich brauche eine Make-up-Tabelle zu erstellen, wo die Start- und Ziel Begriff ist: 01/01 bis 31.05 (Feder) und für Sommersemester ist 06/01 bis 08/31 und für die Herbstsemester ist es 09/01 bis 12/31 dies muss unabhängig davon, was das akademische Jahr ist widerspiegeln. Die Idee ist, die Lücken zwischen acad Term Enddatum (Frühjahr) und acad zu beseitigen Begriff Startdatum (Sommer) zwischen zwei aufeinander folgenden Begriffen.

Ich habe keine Ahnung, wie es geht. Irgendwelche Ideen sind willkommen!

Danke

+1

Zeigen Sie uns db Schema, Beispieldaten, aktuelle und erwartete Ausgabe. \t Bitte lesen Sie [** How-to-Ask **] (http://stackoverflow.com/help/how-to-ask) \t \t Und hier ist ein großartiger Ort, um [** START **] (http://spaghettiba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/) um zu erfahren, wie Sie die Qualität Ihrer Fragen verbessern und bessere Antworten erhalten. \t [** Erstellen eines minimalen, vollständigen und überprüfbaren Beispiels **] (http://Stackoverflow.com/help/mcve) \t Versuchen Sie, ein Beispiel in http://rextester.com zu erstellen –

Antwort

0

Zuerst ein wenig Testdaten:

CREATE TABLE #dates (TermStart DATE, TermEnd DATE, Term VARCHAR(20)) 
INSERT INTO #dates (TermStart, TermEnd, Term) 
VALUES ('2017-01-16','2017-05-18','spring'), 
('2017-06-05','2017-08-04','summer'), 
('2017-08-24','2017-12-20','fall') 

Und dann die Lösung:

SELECT 
    Term 
    , TermStart 
    , TermEnd 
    , NewStart = CASE WHEN LAG(DATEPART(MONTH,DATEADD(DAY,DATEPART(DAY,TermEnd)*-1,DATEADD(MONTH,1,TermEnd)))) OVER (ORDER BY TermStart ASC) = DATEPART(MONTH,TermStart) 
         THEN DATEADD(MONTH,1,DATEADD(DAY,1,DATEADD(dd,DATEPART(DAY,TermStart)*-1,TermStart))) 
         ELSE DATEADD(DAY,1,DATEADD(dd,DATEPART(DAY,TermStart)*-1,TermStart)) 
         END 
    , NewEnd = DATEADD(DAY,DATEPART(DAY,TermEnd)*-1,DATEADD(MONTH,1,TermEnd)) 
FROM #dates 

Ergebnisse:

Term TermStart TermEnd  NewStart NewEnd 
------------------------------------------------------ 
spring 2017-01-16 2017-05-18 2017-01-01 2017-05-31 
summer 2017-06-05 2017-08-04 2017-06-01 2017-08-31 
fall 2017-08-24 2017-12-20 2017-09-01 2017-12-31 
0

Ich versuchte dies und es funktionierte :)

with cte as 
(
SELECT 
    New_Academic_Term_Start_DTTM = CASE WHEN Academic_Term_Code like 'SPRING' 
           then 
     concat(year(Academic_Term_Start_DTTM),'-','01','-','01') 
           WHEN Academic_Term_Code like 'SUMMER' 
           then 
     concat(year(Academic_Term_Start_DTTM),'-','06','-','01') 
           WHEN Academic_Term_Code like 'FALL' 
           then 
     concat(year(Academic_Term_Start_DTTM),'-','08','-','21') 
           end 
     from D_Term 
) 
select 
    convert(datetime2(7),New_Academic_Term_End_DTTM,120) as 
    New_Academic_Term_End_DTTM 
    from cte 
Verwandte Themen