Er is hier een link voor andere eerdere pogingen http://www.sqlteam. com/forums/topic.asp?TOPIC_ID=60510
Dit is de OUDE code voor de functie
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
Na het briljante antwoord van @AndriyM te hebben gecombineerd met het mijne, zijn we op één regel uitgekomen. Dit is de NIEUWE 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
Uitleg voor de oude code (ik ga de nieuwe code niet uitleggen. Het zijn fragmenten uit mijn code en de code van AndriyM):
Vinden van weekdag 4 van de gekozen datum
dateadd(week, datediff(day, 0, @date)/7, 3)
Isojaar vinden - jaar van weekdag 4 van een week is altijd hetzelfde jaar als het isojaar van die week
datediff(yy, 0, day4)
Bij het optellen van 3 dagen bij de eerste dag van het isojaar wordt een willekeurige dag van de eerste isoweek van het isojaar gevonden
dateadd(yy, datediff(yy, 0, day4),3)
relatieve week van de eerste isoweek van het isojaar vinden
datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7
Het vinden van de maandag minus 4 dagen van de eerste isoweek resulteert in de donderdag van de week VOOR de eerste dag van de eerste isoweek van het isojaar
dateadd(ww, datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7,-4)
Als je de eerste donderdag van de week voor de eerste isoweek en de eerste donderdag van de gekozen week weet, is het vrij eenvoudig om de week te berekenen, het maakt niet uit welke instellingsdatum het eerst heeft aangezien de weekdagen van beide datums donderdagen zijn.
datediff(ww, dateadd(ww, datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7,-4),day4)