Der er et link her til andre tidligere forsøg http://www.sqlteam. com/forums/topic.asp?TOPIC_ID=60510
Dette er den GAMLE kode for 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 at have kombineret @AndriyM's geniale svar med mit eget, er vi nede på 1 linje. Dette er den NYE kode.
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
Forklaring på den gamle kode (vil ikke forklare den nye kode. Det er fragmenter fra min kode og AndriyMs kode):
Find ugedag 4 på den valgte dato
dateadd(week, datediff(day, 0, @date)/7, 3)
Find isoår - år på ugedag 4 af en uge er altid det samme år som isoår i den uge
datediff(yy, 0, day4)
Når der lægges 3 dage til den første dag i isoåret findes en tilfældig dag i den første isouge i isoåret
dateadd(yy, datediff(yy, 0, day4),3)
finde relativ uge af den første isouge i isoåret
datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7
At finde mandag minus 4 dage i den første isouge resulterer i torsdag i ugen FØR den første dag i den første isouge i isoåret
dateadd(ww, datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7,-4)
At kende den første torsdag i ugen før den første isouge og den første torsdag i den valgte uge, gør det ret nemt at beregne ugen, det er ligegyldigt, hvilken indstilling dato først har, da ugedagene for begge datoer er torsdage.
datediff(ww, dateadd(ww, datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7,-4),day4)