c0nsp1r4cy
Goto Top

MS SQL SMS - Zwei Datumswerte (von-bis) in einzelne Zeilen aufteilen

Ahoi allerseits,

ich stehe auf dem Schlauch.

Auch all meine Suchen liefen bisher ins Leere. Also probier ichs hier mal.

Wir haben hier eine Tabelle "Abwesenheit".

Dort sind Datensätze in folgender Form vorhanden:

PersNr - Abwgrnd - von - bis
1111 - Urlaub - 22.07.2019 - 26.07.2019
2222 - krank - 22.07.2019 - 23.07.2019
3333 - Schule - 22.07.2019 - 24.07.2019

Ich möchte nun die Datensätze aufteilen:

1111 - Urlaub - 22.07.2019 - 26.07.2019 | 22.07.2019
1111 - Urlaub - 22.07.2019 - 26.07.2019 | 23.07.2019
1111 - Urlaub - 22.07.2019 - 26.07.2019 | 24.07.2019
1111 - Urlaub - 22.07.2019 - 26.07.2019 | 25.07.2019
1111 - Urlaub - 22.07.2019 - 26.07.2019 | 26.07.2019
2222 - krank - 22.07.2019 - 23.07.2019 | 22.07.2019
2222 - krank - 22.07.2019 - 23.07.2019 | 22.07.2019
3333 - Schule - 22.07.2019 - 24.07.2019 | 22.07.2019
3333 - Schule - 22.07.2019 - 24.07.2019 | 23.07.2019
3333 - Schule - 22.07.2019 - 24.07.2019 | 24.07.2019

Über Hilfe würde ich mich sehr freuen.

PS: Sollte das so nicht möglich sein, könnte ich noch einen Kalender joinen.

Vielen Dank vorab!

Content-Key: 489351

Url: https://administrator.de/contentid/489351

Printed on: April 25, 2024 at 01:04 o'clock

Member: akretschmer
akretschmer Aug 28, 2019 updated at 12:55:51 (UTC)
Goto Top
ist möglich:


test=*# select * from c0nsp1r4cy ;
 pernr | grund  |    von     |    bis     
-------+--------+------------+------------
   111 | Urlaub | 2019-07-22 | 2019-07-26
  2222 | krank  | 2019-07-22 | 2019-07-23
  3333 | Schule | 2019-07-22 | 2019-07-24
(3 rows)

test=*# select c.*, d.d::date from c0nsp1r4cy c left join lateral (select * from generate_series(c.von, c.bis, '1day'::interval)d) d on true; 
 pernr | grund  |    von     |    bis     |     d      
-------+--------+------------+------------+------------
   111 | Urlaub | 2019-07-22 | 2019-07-26 | 2019-07-22
   111 | Urlaub | 2019-07-22 | 2019-07-26 | 2019-07-23
   111 | Urlaub | 2019-07-22 | 2019-07-26 | 2019-07-24
   111 | Urlaub | 2019-07-22 | 2019-07-26 | 2019-07-25
   111 | Urlaub | 2019-07-22 | 2019-07-26 | 2019-07-26
  2222 | krank  | 2019-07-22 | 2019-07-23 | 2019-07-22
  2222 | krank  | 2019-07-22 | 2019-07-23 | 2019-07-23
  3333 | Schule | 2019-07-22 | 2019-07-24 | 2019-07-22
  3333 | Schule | 2019-07-22 | 2019-07-24 | 2019-07-23
  3333 | Schule | 2019-07-22 | 2019-07-24 | 2019-07-24
(10 rows)

test=*#


Ist aber jetzt PostgreSQL. Da sind 2 Features, die M$SQL vermutlich nicht hat:


  • generate_series(), kann man sich aber in M$SQL wohl nachbauen, Google weiß wie
  • LATERAL JOIN, das ist SQL-Standard, können aber IMHO nur sehr wenige Datenbanken
Member: ukulele-7
ukulele-7 Aug 28, 2019 at 14:54:35 (UTC)
Goto Top
In MSSQL ist CTE eine Möglichkeit:
WITH t(PersNr,Abwgrnd,von,bis,tag) AS (
SELECT PersNr,Abwgrnd,von,bis,von
FROM deine_tabelle
UNION ALL
SELECT PersNr,Abwgrnd,von,bis,dateadd(day,1,von)
FROM t
WHERE datediff(day,von,bis) > 0 )
SELECT * FROM t