Det finns en länk här för andra tidigare försök http://www.sqlteam. com/forums/topic.asp?TOPIC_ID=60510
Detta är den GAMLA koden för funktionen
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
Efter att ha kombinerat @AndriyM:s briljanta svar med mitt eget är vi nere på 1 rad. Detta är den NYA koden.
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
Förklaring till den gamla koden (kommer inte att förklara den nya koden. Det är fragment från min kod och AndriyMs kod):
Hitta veckodag 4 av det valda datumet
dateadd(week, datediff(day, 0, @date)/7, 3)
Hitta isoår – år för veckodag 4 i veckan är alltid samma år som veckans isoår
datediff(yy, 0, day4)
När man lägger till 3 dagar till den första dagen i isoåret hittas en slumpmässig dag i den första isoveckan i isoåret
dateadd(yy, datediff(yy, 0, day4),3)
hitta relativ vecka för den första isoveckan i isoåret
datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7
Att hitta måndagen minus 4 dagar för den första isoveckan resulterar i torsdagen i veckan FÖRE den första dagen i den första isoveckan i isoåret
dateadd(ww, datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7,-4)
Att känna till första torsdagen i veckan före den första isoveckan och första torsdagen i den valda veckan gör det ganska enkelt att beräkna veckan, det spelar ingen roll vilken inställning datefirst har eftersom veckodagarna för båda datumen är torsdagar.
datediff(ww, dateadd(ww, datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7,-4),day4)