I like your method Tomasz, it leads to much cleaner looking queries.
However, your code doesn't quite work.
In particular you are subtracting 1 from the day of the week twice
This modified version works
CREATE FUNCTION dbo.fnISOweek(@date datetime)
RETURNS int
AS
BEGIN
declare @dayOfWeek int
declare @1ThISOWeek1ThDay datetime
declare @4ThJan datetime
declare @1StJan datetime
declare @31StDec datetime
declare @numberOfISOweeks int
declare @Tmp int
declare @returnValue as int
set @4ThJan = cast(CAST(YEAR(@date) AS CHAR(4)) + '0104' as datetime)
set @1StJan = cast(CAST(YEAR(@date) AS CHAR(4)) + '0101' as datetime)
set @31StDec = cast(CAST(YEAR(@date) AS CHAR(4)) + '1231' as datetime)
--"rule of thursday"
if (DATEPART(dw, @1StJan) = 5 or DATEPART(dw, @31StDec) = 5 )
set @numberOfISOweeks = 53
else
set @numberOfISOweeks = 52
set @dayOfWeek = DATEPART(dw, @4ThJan)
set @1ThISOWeek1ThDay = DATEADD(day, -(@dayOfWeek -1) ,@4ThJan)
if @date @numberOfISOweeks
set @returnValue = 1 -- or -1 as an error
return @returnValue
END