SQL Server: Aufteilen einer Zeile in mehrere Zeilen basierend auf ihrem Start- und Enddatum

Lloyd Thomas

SQL Server: Ich habe eine Abwesenheitstabelle, die einen Datensatz pro Abwesenheit eines Mitarbeiters enthält. Darin sind das Start- und Enddatum der Abwesenheit enthalten. z.B

Person Ref    Start Date     End Date
---------------------------------------
1234          01/01/2021     05/01/2021

Ich möchte diese Zeile basierend auf dem Datumsbereich in mehrere Zeilen aufteilen, sodass anstelle einer Zeile für die Abwesenheit eine Zeile für jeden Tag der Abwesenheit vorhanden ist, wie folgt:

Person Ref    Start Date   End Date
------------------------------------
1234          01/01/2021   01/01/2021
1234          02/01/2021   02/01/2021
1234          03/01/2021   03/01/2021
1234          04/01/2021   04/01/2021
1234          05/01/2021   05/01/2021

Ist es möglich, die Zeile basierend auf dem Datumsbereich in separate Zeilen aufzuteilen, sodass jeder Abwesenheitstag eine eigene Zeile hat? Danke im Voraus.

Es ist erwähnenswert, dass dies Quelldaten sind und in einen Staging-Bereich umgewandelt würden.

UPDATE: Ich habe noch ein kleines Problem, könnten Sie mir helfen? In meiner aktuellen Tabelle gibt es auch eine Spalte, wie viele Schichten bei Abwesenheit ausgefallen sind mit Personenbezug, Start- und Enddatum. Im Moment bedeutet die Aufteilung des Datensatzes in mehrere Zeilen, die jeden Tag und nicht einen Zeitrahmen darstellen, dass die Spalte für die Anzahl der verlorenen Schichten dupliziert wird. zB in der alten Tabelle, wenn jemand für 5 Tage frei ist und 3 Schichten verliert, gibt es in der neuen Tabelle 3 Zeilen - eine für jeden Tag - und jeder Tag wird als 3-Schicht-Ausfall angezeigt. Gibt es eine Möglichkeit das aufzuteilen?

Um dies besser zu erklären, sah die Tabelle früher so aus:

Person Ref    Start Date   End Date    Shifts Lost
--------------------------------------------------
1234          01/01/2021   05/01/2021  3    

Jetzt sieht es so aus (wegen der Aufteilung die wir gemacht haben)

Person Ref    Start Date   End Date    Shifts Lost
--------------------------------------------------
1234          01/01/2021   01/01/2021  3    
1234          02/01/2021   02/01/2021  3
1234          03/01/2021   03/01/2021  3
1234          04/01/2021   04/01/2021  3
1234          05/01/2021   05/01/2021  3

Gibt es eine Möglichkeit, die Anzahl der 3 verlorenen Verschiebungen zwischen den Zeilen aufzuteilen? Aufgrund von Schichtmustern wird jemand, der 5 Tage abwesend ist, nicht unbedingt 5 Schichten verpassen, in diesem Fall verpassen sie 3. Gibt es eine Möglichkeit, dies so zu gestalten:

Person Ref    Start Date   End Date    Shifts Lost
--------------------------------------------------
1234          01/01/2021   01/01/2021  1    
1234          02/01/2021   02/01/2021  1
1234          03/01/2021   03/01/2021  1
1234          04/01/2021   04/01/2021  0
1234          05/01/2021   05/01/2021  0

Vielen Dank

John Cappelletti

Wenn Sie keine Kalendertabelle haben (sehr zu empfehlen), können Sie eine Ad-hoc-Zähltabelle zusammen mit einem einfachen JOIN verwenden.

Sie werden feststellen Top 1000, dass dies auf ein angemesseneres Niveau eingestellt werden kann.

Beispiel oder dbFiddle

Select [Person Ref]
      ,[Start Date] = dateadd(DAY,N,[Start Date])
      ,[End Date]   = dateadd(DAY,N,[Start Date])
 From  YourTable A
 Join  (
        Select Top 1000 N=-1+Row_Number() Over (Order By (Select Null))
         From  master..spt_values n1,master..spt_values n2
       ) B on N <= datediff(DAY,[Start Date],[End Date])

Kehrt zurück

Person Ref  Start Date  End Date
1234        2021-01-01  2021-01-01
1234        2021-01-02  2021-01-02
1234        2021-01-03  2021-01-03
1234        2021-01-04  2021-01-04
1234        2021-01-05  2021-01-05

Update --- Schichten verloren

Select [Person Ref]
      ,[Start Date] = dateadd(DAY,N,[Start Date])
      ,[End Date]   = dateadd(DAY,N,[Start Date])
      ,[Shifts Lost]= case when N<[Shifts Lost] then 1 else 0 end
 From  YourTable A
 Join  (
        Select Top 10000 N=-1+Row_Number() Over (Order By (Select Null))
         From  master..spt_values n1,master..spt_values n2
       ) B on N <= datediff(DAY,[Start Date],[End Date])

Ergebnisse

Person Ref  Start Date  End Date    Shifts Lost
1234        2021-01-01  2021-01-01  1
1234        2021-01-02  2021-01-02  1
1234        2021-01-03  2021-01-03  1
1234        2021-01-04  2021-01-04  0
1234        2021-01-05  2021-01-05  0

Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.

Bei Verstößen wenden Sie sich bitte [email protected] Löschen.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

TOP Liste

heißlabel

Archiv