sql >> Databasteknik >  >> RDS >> Sqlserver

Isoweek i SQL Server 2005

Det finns en länk här för andra tidigare försök http://www.sqlteam. com/forums/topic.asp?TOPIC_ID=60510

Detta är den GAMLA koden för 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 att ha kombinerat @AndriyM:s briljanta svar med mitt eget är vi nere på 1 rad. Detta är den NYA koden.

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

Förklaring till den gamla koden (kommer inte att förklara den nya koden. Det är fragment från min kod och AndriyMs kod):

Hitta veckodag 4 av det valda datumet

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

Hitta isoår – år för veckodag 4 i veckan är alltid samma år som veckans isoår

datediff(yy, 0, day4)

När man lägger till 3 dagar till den första dagen i isoåret hittas en slumpmässig dag i den första isoveckan i isoåret

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

hitta relativ vecka för den första isoveckan i isoåret

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

Att hitta måndagen minus 4 dagar för den första isoveckan resulterar i torsdagen i veckan FÖRE den första dagen i den första isoveckan i isoåret

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

Att känna till första torsdagen i veckan före den första isoveckan och första torsdagen i den valda veckan gör det ganska enkelt att beräkna veckan, det spelar ingen roll vilken inställning datefirst har eftersom veckodagarna för båda datumen är torsdagar.

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


  1. MYSQL UPPDATERING med IN och Subquery

  2. När kan vi använda ett identifikationsnummer istället för dess namn i PostgreSQL?

  3. Använd datum i Excel-cell i BETWEEN-satsen i SQL-fråga

  4. Importera "xml" till SQL Server