none
Begin between Woche 50 and Woche 04 RRS feed

  • Frage

  • Hallo,

    ich möchte erreichen, dass alle Werte ausgegeben werden, bei denen das  Begin-Datum zwischen KW 50 und KW 04 des folgenden Jahres liegt.
    Leider funktioniert dabei die folgende Abfrage nicht:

    select *
    FROM BI02.dbo.infos_01
    where DATEPART(ISO_WEEK, Beginn) between  datepart(ISO_WEEK,dateadd (WEEK,9,GETDATE())) and datepart(ISO_WEEK,dateadd (WEEK,12,GETDATE()))

    Das Problem scheint am Jahresübergang zu liegen. Wenn ich die gleiche Abfrage für KW 50 - 52 ausführe, dann funktioniert das Ganze.
    Wie könnte ich dieses Problem denn lösen?
    Danke!

    Olaf

    Montag, 28. Oktober 2019 13:41

Antworten

  • Das ist halt so:
    ISO_WEEK liefert nur die 2-stellige Woche zwischen 1 und 53 ohne das Jahr. Deshalb ist eine Between-Abfrage da nicht sinnvoll.

    Du benötigst eine Funktion, die dir das Ergebnis JJJJKW liefert. Dabei ist ebenso zu berücksichtigen, dass die KW 1 im Dezember und die KW 53 auch im Januar vorkommt:

    case
    when datepart(iso_week, datum) = 1 and month(datum) = 12 then (year(datum) + 1) * 100 + datepart(iso_week, datum)
    when datepart(iso_week, datum) >= 52 and month(datum) = 1 then (year(datum) - 1) * 100 + datepart(iso_week, datum)
    else year(datum) * 100 + datepart(iso_week, datum)
    end

    Das packst du dir am Besten in eine SQL-Function.

    Dann kannst du die Abfrage so gestalten:

    where MyWeekFkt(begin) between year(Beginn) * 100 + 50 and (year(begin) + 1) * 100 + 04

    • Als Antwort markiert Olaf113 Dienstag, 5. November 2019 13:05
    Montag, 28. Oktober 2019 17:21

Alle Antworten

  • Das ist halt so:
    ISO_WEEK liefert nur die 2-stellige Woche zwischen 1 und 53 ohne das Jahr. Deshalb ist eine Between-Abfrage da nicht sinnvoll.

    Du benötigst eine Funktion, die dir das Ergebnis JJJJKW liefert. Dabei ist ebenso zu berücksichtigen, dass die KW 1 im Dezember und die KW 53 auch im Januar vorkommt:

    case
    when datepart(iso_week, datum) = 1 and month(datum) = 12 then (year(datum) + 1) * 100 + datepart(iso_week, datum)
    when datepart(iso_week, datum) >= 52 and month(datum) = 1 then (year(datum) - 1) * 100 + datepart(iso_week, datum)
    else year(datum) * 100 + datepart(iso_week, datum)
    end

    Das packst du dir am Besten in eine SQL-Function.

    Dann kannst du die Abfrage so gestalten:

    where MyWeekFkt(begin) between year(Beginn) * 100 + 50 and (year(begin) + 1) * 100 + 04

    • Als Antwort markiert Olaf113 Dienstag, 5. November 2019 13:05
    Montag, 28. Oktober 2019 17:21
  • Vielen Dank!
    Das teste ich!
    Dienstag, 29. Oktober 2019 07:16