Es gibt hier einen Link für andere frühere Versuche http://www.sqlteam. com/forums/topic.asp?TOPIC_ID=60510
Dies ist der ALTE Code für die Funktion
CREATE function f_isoweek(@date datetime)
RETURNS INT
as
BEGIN
DECLARE @rv int
SELECT @rv = datediff(ww, dateadd(ww, datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7,-4),day4)
FROM (SELECT dateadd(ww, datediff(day, 0, @date)/7, 3) day4) a
RETURN @rv
END
Nachdem ich die brillante Antwort von @ AndriyM mit meiner eigenen kombiniert habe, sind wir auf 1 Zeile gesunken. Dies ist der NEUE Code.
CREATE function f_isoweek(@date datetime)
RETURNS INT
as
BEGIN
RETURN (datepart(DY, datediff(d, 0, @date) / 7 * 7 + 3)+6) / 7
-- replaced code for yet another improvement.
--RETURN (datepart(DY, dateadd(ww, datediff(d, 0, @date) / 7, 3))+6) / 7
END
Erklärung für den alten Code (erklärt nicht den neuen Code. Es sind Fragmente aus meinem Code und dem Code von AndriyM):
Wochentag 4 des gewählten Datums finden
dateadd(week, datediff(day, 0, @date)/7, 3)
Finden des Isojahres - Jahr des Wochentags 4 einer Woche ist immer das gleiche Jahr wie das Isojahr dieser Woche
datediff(yy, 0, day4)
Beim Addieren von 3 Tagen zum ersten Tag des Isojahres wird ein zufälliger Tag der ersten Isowoche des Isojahres gefunden
dateadd(yy, datediff(yy, 0, day4),3)
Ermittlung der relativen Woche der ersten Isowoche des Isojahres
datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7
Den Montag minus 4 Tage der ersten Isowoche zu finden, ergibt den Donnerstag der Woche VOR dem ersten Tag der ersten Isowoche des Isojahres
dateadd(ww, datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7,-4)
Wenn man den ersten Donnerstag der Woche vor der ersten Isowoche und den ersten Donnerstag der gewählten Woche kennt, ist es ziemlich einfach, die Woche zu berechnen, es spielt keine Rolle, welche Einstellung datefirst hat, da die Wochentage beider Daten Donnerstage sind.
datediff(ww, dateadd(ww, datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7,-4),day4)