Тук има връзка за други по-ранни опити http://www.sqlteam. com/forums/topic.asp?TOPIC_ID=60510
Това е СТАРИЯ код за функцията
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
След като комбинирам брилянтния отговор на @AndriyM с моя собствен, оставаме до 1 ред. Това е НОВИЯ код.
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
Обяснение за стария код (няма да обяснявам новия код. Това са фрагменти от моя код и кода на AndriyM):
Намиране на ден от седмицата 4 от избраната дата
dateadd(week, datediff(day, 0, @date)/7, 3)
Намиране на изогодина - година от делничен ден 4 от седмицата винаги е същата година като изогодината на тази седмица
datediff(yy, 0, day4)
При добавяне на 3 дни към първия ден на изогодината се намира случаен ден от първата изоседмица на изогодината
dateadd(yy, datediff(yy, 0, day4),3)
намиране на относителна седмица от първата изоседмица на изогодината
datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7
Намирането на понеделник минус 4 дни от първата изоседмица води до четвъртък от седмицата ПРЕДИ първия ден от първата изоседмица на изогодината
dateadd(ww, datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7,-4)
Познаването на първия четвъртък от седмицата преди първата изоседмица и първия четвъртък от избраната седмица улеснява изчисляването на седмицата, няма значение коя дата на настройка е първата, тъй като работните дни и на двете дати са четвъртъци.
datediff(ww, dateadd(ww, datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7,-4),day4)