2017-11-20 5 views
-2

Ich versuchte, Problem zu lösen, wie unten: Ich habe Tabelle, wo es zwei Spalten, date_from und date_to gibt. Und es gibt ein paar Zeilen, zum BeispielUniversal-Algorithmus Datumsbereiche

1 2016-08-01 2016-12-31 
2 2017-01-01 2017-08-01 
3 2017-08-02 2017-12-31 

Ich muss die Zeile zwischen der zweiten und dritten Zeile einfügen. mit Datumsbereich wie ein Vormonats Ergebnis sollte so wie für November sein:

1 2016-08-01 2016-12-31 
2 2017-01-01 2017-08-01 
3 2017-08-02 2017-09-30 
4 2017-10-01 2017-10-31 
5 2017-11-01 2017-12-31 

Was ist die beste und einfache Lösung für die Aufgabe wie oben?

Dank für Feedback Reagrds

+0

Wird Ihr Problem einfach gelöst, indem Sie nach 'date_from' sortieren? Welche Programmiersprache verwenden Sie? –

+0

Ms SQL gespeicherte Prozedur – malin

Antwort

0

Malin Wenn Ihre Tabelle wie folgt definiert ist:

create table periods (
    date_from date, 
    date_until date 
); 
insert into periods values 
    ('2016-08-01', '2016-12-31'), 
    ('2017-01-01', '2017-08-01'), 
    ('2017-08-02', '2017-12-31'); 

Dann Sie diese gespeicherte Prozedur verwenden:

create proc add_period(@add_from date, @add_until date) as 
begin 
    delete from periods 
     where date_from between @add_from and @add_until 
     and date_until between @add_from and @add_until; 
    insert into periods(date_from, date_until) 
     select dateadd(day, 1, @add_until), date_until 
     from periods 
     where date_from < @add_from 
     and date_until > @add_until; 
    update periods 
     set date_until = dateadd(day, -1, @add_from) 
     where @add_from between date_from and date_until; 
    update periods 
     set date_from = dateadd(day, 1, @add_until) 
     where @add_until between date_from and date_until; 
    insert into periods(date_from, date_until) 
     values (@add_from, @add_until); 
end; 
go 

Sie würde es so nennen :

exec add_period '2017-10-01','2017-10-31'; 
+0

Es funktioniert, danke – malin

Verwandte Themen