Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Isoweek in SQL Server 2005

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)