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-ID: 489351

Url: https://administrator.de/forum/ms-sql-sms-zwei-datumswerte-von-bis-in-einzelne-zeilen-aufteilen-489351.html

Ausgedruckt am: 22.12.2024 um 03:12 Uhr

akretschmer
akretschmer 28.08.2019 aktualisiert um 14:55:51 Uhr
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
ukulele-7
ukulele-7 28.08.2019 um 16:54:35 Uhr
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