Datum aus Kalenderwoche und Jahr/Monat extrahieren

ny_unity

SQL-Guru
Beiträge
208
Hallo zusammen,

ich benötige ein paar Denkanstöße, sitze etwas auf dem Schlauch.

In der Datenbank sind Werte gespeichert, die sind wie folgt aufgebaut:

Es gibt eine Spalte JAHR, MONAT, WOCHE, KALENDERWOCHE, T1, T2, T3, T4, T5, T6, T7

Ein Beispiel:

Personalnr = 1
Jahr = 2022
Monat = 6
Woche = 1
Kalenderwoche = 22
T1 = null
T2 = null
T3 = 7
T4 = 8
T5 = 9
T6 = null
T7 = null

nächster Datensatz
Personalnr = 1
Jahr = 2022
Monat = 6
Woche = 2
Kalenderwoche = 23
T1 = 10
T2 = 11
T3 = 12
T4 = 13
T5 = 14
T6 = null
T7 = null

Ich möchte diese Daten so aufbereiten, dass ich das später in einer Art Kalender anzeigen lassen kann. Sprich, es soll erstmal Rohdaten entstehen die wie folgt aussehen:

Spalte Datum, Personalnr, Jahr, Monat, Wert aus T1/T2/T3/T4/T5/T6/T7

Beispiel:

01.06.2022 | 1 | 2022 | 6 | 7
02.06.2022 | 1 | 2022 | 6 | 8
03.06.2022 | 1 | 2022 | 6 | 9
04.06.2022 | 1 | 2022 | 6 | null
05.06.2022 | 1 | 2022 | 6 | null
06.06.2022 | 1 | 2022 | 6 | 10
07.06.2022 | 1 | 2022 | 6 | 11
08.06.2022 | 1 | 2022 | 6 | 12
09.06.2022 | 1 | 2022 | 6 | 13
10.06.2022 | 1 | 2022 | 6 | 14
11.06.2022 | 1 | 2022 | 6 | null
12.06.2022 | 1 | 2022 | 6 | null

Was ist passiert? Die Werte aus T1 - T7 wurden einem Datumswert zugeordnet, es wurde also aus Jahr, Monat, Woche/Kalenderwoche ein Datum generiert.

Ich habe keinen Lösungsansatz wie ich das umsetzen kann, hat von euch jemand eine Idee?

Grüße

Erik
 
Werbung:
darauf habe ich leider kein Einfluss, ich kann nur auf die Datenbank und Auswertungen schreiben. Wir nutzen das Programm für unsere tägliche Abrechnung und Arbeit.
 
ah, jetzt sehe ich die logik. Nun ja, das Datum aus den Fragmenten wieder reanimieren und dann für die 7 Spalten je das Datum + Nummer der Spalte an Tagen addieren und die Spalte halt ausgeben, für jede Spalte ein union all. Grob vereinfacht:

Code:
postgres=# select * from ny;
 t1 | t2 | t3 | t4 
----+----+----+----
 11 | 10 | 13 | 17
  4 |  5 |  6 |  7
(2 rows)

postgres=# select current_date, t1 from ny union all select current_date+1, t2 from ny union all select current_date+2, t3 from ny union all select current_date+3, t4 from ny;
 current_date | t1 
--------------+----
 2022-07-19   | 11
 2022-07-19   |  4
 2022-07-20   | 10
 2022-07-20   |  5
 2022-07-21   | 13
 2022-07-21   |  6
 2022-07-22   | 17
 2022-07-22   |  7
(8 rows)

postgres=#

Das ausführlicher zu zeigen ist es mir grad zu warm hier ...
 
🤟
ich habe auch einen Gedankenblitz gehabt, ich habe eine Hilfstabelle gebaut, wo ich mir die Datumswerte vom 01.06.2022 - 30.06.2022 als Zeile ausgeben lasse, danach nehme ich diese Werte und zerteile diese, wie es in der verkorksten Datenbank steht.

SQL:
WITH parameter AS
(
SELECT    convert(date,cast(datepart(year,dateadd(month,-1,getdate())) as nvarchar(4)) + '-' + cast(datepart(month,dateadd(month,-1,getdate())) as nvarchar(2)) + '-01') as startdatum,
        datepart(weekday,convert(date,cast(datepart(year,dateadd(month,-1,getdate())) as nvarchar(4)) + '-' + cast(datepart(month,dateadd(month,-1,getdate())) as nvarchar(2)) + '-01')) as wochentag,
        datepart(ISO_WEEK,convert(date,cast(datepart(year,dateadd(month,-1,getdate())) as nvarchar(4)) + '-' + cast(datepart(month,dateadd(month,-1,getdate())) as nvarchar(2)) + '-01')) as kw,
        datepart(month,convert(date,cast(datepart(year,dateadd(month,-1,getdate())) as nvarchar(4)) + '-' + cast(datepart(month,dateadd(month,-1,getdate())) as nvarchar(2)) + '-01')) as monat,
        datepart(year,convert(date,cast(datepart(year,dateadd(month,-1,getdate())) as nvarchar(4)) + '-' + cast(datepart(month,dateadd(month,-1,getdate())) as nvarchar(2)) + '-01')) as jahr

UNION ALL
SELECT  dateadd(day,1,startdatum) AS startdatum,
        datepart(weekday,dateadd(day,1,startdatum)) as wochentag,
        datepart(ISO_WEEK,dateadd(day,1,startdatum)) as kw,
        datepart(month,dateadd(day,1,startdatum)) as monat,
        datepart(year,dateadd(day,1,startdatum)) as jahr
FROM   parameter
WHERE   dateadd(day,1,startdatum) <= dateadd(day,-1,convert(date,cast(datepart(year,getdate()) as nvarchar(4)) + '-' + cast(datepart(month,getdate()) as nvarchar(2)) + '-01'))
)

select * from parameter

Ausgabe:

SQL:
startdatum    wochentag    kw    monat    jahr
2022-06-01    3    22    6    2022
2022-06-02    4    22    6    2022
2022-06-03    5    22    6    2022
2022-06-04    6    22    6    2022
2022-06-05    7    22    6    2022
2022-06-06    1    23    6    2022
2022-06-07    2    23    6    2022
2022-06-08    3    23    6    2022
2022-06-09    4    23    6    2022
2022-06-10    5    23    6    2022
2022-06-11    6    23    6    2022
2022-06-12    7    23    6    2022
2022-06-13    1    24    6    2022
2022-06-14    2    24    6    2022
2022-06-15    3    24    6    2022
2022-06-16    4    24    6    2022
2022-06-17    5    24    6    2022
2022-06-18    6    24    6    2022
2022-06-19    7    24    6    2022
2022-06-20    1    25    6    2022
2022-06-21    2    25    6    2022
2022-06-22    3    25    6    2022
2022-06-23    4    25    6    2022
2022-06-24    5    25    6    2022
2022-06-25    6    25    6    2022
2022-06-26    7    25    6    2022
2022-06-27    1    26    6    2022
2022-06-28    2    26    6    2022
2022-06-29    3    26    6    2022
2022-06-30    4    26    6    2022

jetzt könnte ich mit einem Join auf die Tabelle gehen und mir für Wochentag 3 dann T3 nehmen, wenn Monat = Monat, Jahr = Jahr, KW = KW ist...

aber ich schaue mir erstmal deins an, vielleicht ist das einfacher 🙃
 
Werbung:
Du kannst Dir aus deinem Jahr und der Woche ganz einfach ein Datum basteln

select dateadd (week, @wk, dateadd (year, @yr-1900, 0)) - 4 -
datepart(dw, dateadd (week, @wk, dateadd (year, @yr-1900, 0)) - 4) + 1

wobei @wk die Woche ist und @yr das Jahr


Darauf kannst du dann einfach den jeweiligen T1-T7 addieren
 
Zuletzt bearbeitet von einem Moderator:
Zurück
Oben