Hmmm that is my function similiar to above but IMHO easier to understand
CREATE FUNCTION ISOweek(@date datetime)
RETURNS int
AS
BEGIN
declare @dayOfWeek int
declare @1ThISOWeek1ThDay datetime
declare @4ThJan datetime
declare @1ThJan datetime
declare @31ThDec datetime
declare @numberOfISOweeks int
declare @Tmp int
declare @returnValue as int
set @4ThJan = cast(CAST(YEAR(@date) AS CHAR(4)) + '-01-04' as datetime)
set @1ThJan = cast(CAST(YEAR(@date) AS CHAR(4)) + '-01-01' as datetime)
set @31ThDec = cast(CAST(YEAR(@date) AS CHAR(4)) + '-12-31' as datetime)
--"rule of thursday"
if (DATEPART(dw, @1ThJan) = 5 or DATEPART(dw, @31ThDec) = 5 )
set @numberOfISOweeks = 53
else
set @numberOfISOweeks = 52
set @dayOfWeek = (select DATEPART(dw, @4ThJan) - 1)
if @dayOfWeek = 0
set @dayOfWeek = 7
set @1ThISOWeek1ThDay = (select DATEADD(day, -(@dayOfWeek -1) ,@4ThJan))
if @date @numberOfISOweeks
set @returnValue = 1 -- or -1 as an error
return @returnValue
END