365 Tage auflisten ab aktuellem Tag

Rambo21

Aktiver Benutzer
Beiträge
37
Hallo Leute,

Ich habe folgendes Problem:
Ich habe eine Tabelle mit Feiertagen
Datum | Name | Art
2016-01-01 | Neujahr | N N = nationaler Feiertag
etc...
2016-12-24 | Weihnachten| W W = Bankenfeiertag/Wochenende
Ich brauche nun eine Tabelle die mir 365 Tage ab heutigem Datum anzeigt. Heute = 22.01.2016, also:
2016-01-22
2016-01-23
2016-01-24
...
2017-01-21

Weiters benötige ich neben den Datümern einen Eintrag A oder W.
A = Arbeitstag, also Mo-Fr
W = Wochenende, also Sa und So bzw. ein Bankenfeiertag am 24.12.2016

Am Ende brauche ich folgendes Ergebnis, wenn ich die Abfrage heute laufen lasse:
2016-01-22;A;(leer) -> Freitag, Arbeitstag
2016-01-23;W;(leer) -> Samstag, Wochenende
2016-01-24;W;(leer) -> Sonntag, Wochenende
2016-01-25;A;(leer) -> Montag, Arbeitstag
...
2016-03-28;N;Ostermontag -> nationaler Feiertag
...
2017-01-21;W;(leer) -> Samstag, Wochenende. letzter Tag in der Liste

Ich hoffe die Frage ist verständlich.
Bitte um eure Unterstützung
 
Werbung:
Code:
WITH raster(datum) AS (
SELECT    cast(getdate() AS DATE)
UNION ALL
SELECT    dateadd(dd,1,datum)
FROM    raster
WHERE    datum < dateadd(dd,365,cast(getdate() AS DATE))
        ),
feiertage(datum,bezeichnung) AS (
SELECT    '2016-03-28',
        'Ostermontag'
        )
SELECT    r.datum,
        (    CASE
            WHEN    f.datum IS NOT NULL
            THEN    'N'
            WHEN    datepart(weekday,r.datum) <= 5
            THEN    'A'
            ELSE    'W'
            END ) AS tolle_spalte1,
        (    CASE
            WHEN    f.datum IS NOT NULL
            THEN    f.bezeichnung
            ELSE    datename(weekday,r.datum)
            END ) + ', ' +
        (    CASE
            WHEN    f.datum IS NOT NULL
            THEN    'nationaler Feiertag'
            WHEN    datepart(weekday,r.datum) <= 5
            THEN    'Arbeitstag'
            ELSE    'Wochenende'
            END ) AS tolle_spalte2
FROM    raster r
LEFT JOIN feiertage f
ON        r.datum = f.datum
OPTION (MAXRECURSION 1000)
Die Feiertagstabelle musst du natürlich nicht im WITH-Teil definieren sondern kannst auch deine eigene Tabelle joinen.
 
Mal in PG für 10 Tage:

Code:
test=*# select d::date, case when extract(dow from d) in (6,0) then 'Weekend' else 'Workday' end from (select current_date + s * '1day'::interval d from generate_series(0,10) s) bla;
  d  |  case
------------+---------
 2016-01-22 | Workday
 2016-01-23 | Weekend
 2016-01-24 | Weekend
 2016-01-25 | Workday
 2016-01-26 | Workday
 2016-01-27 | Workday
 2016-01-28 | Workday
 2016-01-29 | Workday
 2016-01-30 | Weekend
 2016-01-31 | Weekend
 2016-02-01 | Workday
(11 rows)
 
Hallo,

Wow! Danke sieht super aus. Aber ein Problem habe ich: Wieso sieht der Freitag bei mir als Wochenende aus und der Sonntag als Arbeitstag?

1 2016-01-25 A Monday, Arbeitstag
2 2016-01-26 A Tuesday, Arbeitstag
3 2016-01-27 A Wednesday, Arbeitstag
4 2016-01-28 A Thursday, Arbeitstag
5 2016-01-29 W Friday, Wochenende
6 2016-01-30 W Saturday, Wochenende
7 2016-01-31 A Sunday, Arbeitstag
8 2016-02-01 A Monday, Arbeitstag
9 2016-02-02 A Tuesday, Arbeitstag
10 2016-02-03 A Wednesday, Arbeitstag
11 2016-02-04 A Thursday, Arbeitstag
12 2016-02-05 W Friday, Wochenende
13 2016-02-06 W Saturday, Wochenende
14 2016-02-07 A Sunday, Arbeitstag
 
Vermutlich weil Du was falsch machst. Da wir nicht genau wissen, was Du machst, können wir auch nicht sagen, was daran falsch ist ;-)
 
Also mein Code, ausgeführt so wie er da steht unter MSSQL 2014 hat kein deratiges Problem. Kann eigentlich auch nicht an irgendwelchen Spracheinstellungen liegen, datepart(weekday,r.datum) gibt Tag der Woche als Zahl an und die verwende ich im CASE.

PS: Mein Code liefert allerdings 366 Tage...
 
Zuletzt bearbeitet:
Wenn ich select datepart(weekday,getdate()) eingebe, erhalte ich den Wert 2 für Montag. Ich denke, dass ich hier das Problem habe.
@akretschmer: Ich kopiere den Code und füge ihn im MS SQL Server Mgmt Studio. Verwende übrigens MSSQL2012

Ehrlich gesagt verstehe ich datepart(weekday,r.datum) <= 5 nicht. Wofür steht hier 5?

Danke nochmals für die Unterstützung!
 
Achso ja klar, in USA ist Sonntag der erste Wochentag, Montag also der 2te. Also doch länderspezifische Einstellung. Siehe hier: SET DATEFIRST (Transact-SQL)

datepart() liefert dir den Tag der Woche als Zahl, also 1-7. Wenn die Zahl kleiner gleich 5 ist hast du, zumindest in Deutschland, einen Tag zwischen Montag und Freitag, also einen Arbeitstag.
 
Werbung:
Zurück
Oben