none
Bug im Server ISOWEEK function liefert falschen Wert RRS feed

  • Frage

  • Hallo,

    Ich habe eine Applikation, die bereitet uns eigentlich zu jedem Jahreswechsel Probleme mit der Bestimmung der Kalenderwoche 1 im neuen Jahr. Die meisten kennen es, in der Woche wo der 1.1. liegt, kann es mal als KW53 gelten oder aber mal schon als KW 1 gezählt werden. Die Funktionen im SQL Server scheinen mir nicht konsequent zu sein. Ausgangslage, ich möchte ermitteln in welcher Woche und Jahr das Datum 23.02.2015 - 8 Wochen liegt = Das Datum wäre also 29-12-2014, datepart week liefert mir Woche 1 im Jahr, Year liefert mir aber Jahr 2014... wie kann ich das besser abbilden?

    select DateAdd(wk,-8,'20150223') as m_year_full_date  --29-12-2014
    	
    select DATEPART("ISO_WEEK",DateAdd(wk,-8,'20150223')) as m_start_month  -- liefert eine 1 (Woche 1) als Rückgabe	
    	
    select YEAR(DateAdd(wk,-8,'20150223')) as m_year_part  -- liefert 2014

    Als Wiki-Definition habe ich gefunden : "The first week of a year is the week that contains the first Thursday of the year", dass passt 2015 zufällig, da Donnerstag der 1.1. war.

    Kann mir jemand dabei helfen, dieses wiederkehrende Problem zu löschen? Vielen Dank im Vorraus.

    Alex Diedler

    Montag, 23. Februar 2015 14:05

Antworten

  • Hallo Alex,

    nein, da gibt es keinen Bug, nur fehlt etwas, nämlich ein ISO Jahr.

    DATEPART mit ISOWEEK liefert die Kalenderwoche nach ISO. Das hat keinen Einfluss auf die anderen Werte von DATEPART oder synonyme Funkionen wie YEAR; die arbeiten immer mit dem Kalenderjahr. (Etwas wie wk, -8 zieht einfach nur 8 * 7 Tage ab.)

    Um das  ISO-Jahr zu erhalten müsstet Du eine Funktion verwenden, siehe z. B.:

    http://stackoverflow.com/questions/348880/getting-week-number-off-a-date-in-ms-sql-server-2005

    oder eine Kalendertabelle, in der Du den Wert (neben anderen) speicherst.

    Gruß Elmar

    Montag, 23. Februar 2015 14:36
    Beantworter
  • Hi Alex,

    technisch schließe ich mich Elmar an, da z.B. die Year-Funktion von einem gegebenen Datum einfach das Jahr abschneidet und zurückgibt, ohne weitere Berechnungen.

    Aber auch inhaltlich sehe ich da kein Problem: wenn der 01.01. ein Donnerstag ist, dann gehört diese Woche tatsächlich schon zum neuen Jahr (also KW01 von 2015), der Montag dieser Woche liegt aber trotz alledem noch im alten Jahr 2014, da Sylvester einfach noch nicht rum ist.

    Als Vergleich: zum nächsten Jahreswechsel 15/16 ist es genau andersherum. Der Donnerstag ist diesmal der 31.12. und damit liegt die ganze Woche noch im alten Jahr (KW53) , der 02.01.16 ist aber auch hier wieder schon ein Tag aus 2016.

    VG Tarek

    Montag, 23. Februar 2015 22:21

Alle Antworten

  • Hallo Alex,

    nein, da gibt es keinen Bug, nur fehlt etwas, nämlich ein ISO Jahr.

    DATEPART mit ISOWEEK liefert die Kalenderwoche nach ISO. Das hat keinen Einfluss auf die anderen Werte von DATEPART oder synonyme Funkionen wie YEAR; die arbeiten immer mit dem Kalenderjahr. (Etwas wie wk, -8 zieht einfach nur 8 * 7 Tage ab.)

    Um das  ISO-Jahr zu erhalten müsstet Du eine Funktion verwenden, siehe z. B.:

    http://stackoverflow.com/questions/348880/getting-week-number-off-a-date-in-ms-sql-server-2005

    oder eine Kalendertabelle, in der Du den Wert (neben anderen) speicherst.

    Gruß Elmar

    Montag, 23. Februar 2015 14:36
    Beantworter
  • Hi Alex,

    technisch schließe ich mich Elmar an, da z.B. die Year-Funktion von einem gegebenen Datum einfach das Jahr abschneidet und zurückgibt, ohne weitere Berechnungen.

    Aber auch inhaltlich sehe ich da kein Problem: wenn der 01.01. ein Donnerstag ist, dann gehört diese Woche tatsächlich schon zum neuen Jahr (also KW01 von 2015), der Montag dieser Woche liegt aber trotz alledem noch im alten Jahr 2014, da Sylvester einfach noch nicht rum ist.

    Als Vergleich: zum nächsten Jahreswechsel 15/16 ist es genau andersherum. Der Donnerstag ist diesmal der 31.12. und damit liegt die ganze Woche noch im alten Jahr (KW53) , der 02.01.16 ist aber auch hier wieder schon ein Tag aus 2016.

    VG Tarek

    Montag, 23. Februar 2015 22:21