Tutaj znajduje się link do innych wcześniejszych prób http://www.sqlteam. com/forums/topic.asp?TOPIC_ID=60510
To jest STARY kod funkcji
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
Po połączeniu genialnej odpowiedzi @AndriyM z moją własną, jesteśmy w jednej linii. To jest NOWY kod.
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
Wyjaśnienie dla starego kodu (nie będę wyjaśniał nowego kodu. To fragmenty z mojego kodu i kodu AndriyM):
Znalezienie 4 dnia tygodnia wybranej daty
dateadd(week, datediff(day, 0, @date)/7, 3)
Znajdowanie izoroku - rok dnia tygodnia 4 tygodnia jest zawsze tym samym rokiem, co izorok tego tygodnia
datediff(yy, 0, day4)
Po dodaniu 3 dni do pierwszego dnia izoroku zostanie znaleziony losowy dzień pierwszego izotygodnia izoroku
dateadd(yy, datediff(yy, 0, day4),3)
znalezienie względnego tygodnia pierwszego izotygodnia izoroku
datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7
Znalezienie poniedziałku minus 4 dni pierwszego izotygodnia daje wynik czwartku tygodnia PRZED pierwszym dniem pierwszego izotygodnia izoroku
dateadd(ww, datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7,-4)
Znajomość pierwszego czwartku tygodnia przed pierwszym tygodniem i pierwszym czwartkiem wybranego tygodnia sprawia, że obliczenie tygodnia jest dość łatwe, nie ma znaczenia, jakie ustawienie ma pierwsza data, ponieważ dni powszednie obu dat to czwartki.
datediff(ww, dateadd(ww, datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7,-4),day4)