Benutzer mit den meisten Antworten
Bug im Server ISOWEEK function liefert falschen Wert

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
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
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 27. Februar 2015 09:31
- Als Antwort markiert Aleksander Chalabashiev Mittwoch, 4. März 2015 08:09
-
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
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 27. Februar 2015 09:31
- Als Antwort markiert Aleksander Chalabashiev Mittwoch, 4. März 2015 08:09
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
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 27. Februar 2015 09:31
- Als Antwort markiert Aleksander Chalabashiev Mittwoch, 4. März 2015 08:09
-
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
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 27. Februar 2015 09:31
- Als Antwort markiert Aleksander Chalabashiev Mittwoch, 4. März 2015 08:09