sql >> Databáze >  >> RDS >> Sqlserver

Isoweek v SQL Server 2005

Zde je odkaz na další dřívější pokusy http://www.sqlteam. com/forums/topic.asp?TOPIC_ID=60510

Toto je STARÝ kód funkce

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 zkombinování skvělé odpovědi @AndriyM s mou vlastní jsme se dostali na 1 řádek. Toto je NOVÝ kód.

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

Vysvětlení starého kódu (nebudu vysvětlovat nový kód. Jsou to fragmenty mého kódu a kódu AndriyM):

Vyhledání pracovního dne 4 zvoleného data

dateadd(week, datediff(day, 0, @date)/7, 3) 

Vyhledání izoroku – rok pracovního dne 4 v týdnu je vždy stejný rok jako izorok daného týdne

datediff(yy, 0, day4)

Při přidání 3 dnů k prvnímu dni izoroku se najde náhodný den prvního izotýdne izoroku

dateadd(yy, datediff(yy, 0, day4),3)

nalezení relativního týdne prvního izotýdne izoroku

datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7

Nalezení pondělí mínus 4 dny prvního izotýdne vede ve čtvrtek v týdnu PŘED prvním dnem prvního izotýdne izoroku

dateadd(ww, datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7,-4)

Znalost prvního čtvrtku týdne před prvním izovíkem a prvního čtvrtku zvoleného týdne umožňuje poměrně snadno vypočítat týden, nezáleží na nastavení datafirst, protože pracovní dny obou dat jsou čtvrtky.

datediff(ww, dateadd(ww, datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7,-4),day4)


  1. Měření výkonu databáze pod tlakem

  2. Poddotaz Oracle nevidí proměnnou z vnějšího bloku o 2 úrovně výše

  3. Jak LTRIM() funguje v MariaDB

  4. MySQL spouští aktualizaci pole na základě součtu sloupců z jiné tabulky