sql >> Database >  >> RDS >> Sqlserver

Isoweek in SQL Server 2005

Er is hier een link voor andere eerdere pogingen http://www.sqlteam. com/forums/topic.asp?TOPIC_ID=60510

Dit is de OUDE code voor de functie

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

Na het briljante antwoord van @AndriyM te hebben gecombineerd met het mijne, zijn we op één regel uitgekomen. Dit is de NIEUWE code.

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

Uitleg voor de oude code (ik ga de nieuwe code niet uitleggen. Het zijn fragmenten uit mijn code en de code van AndriyM):

Vinden van weekdag 4 van de gekozen datum

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

Isojaar vinden - jaar van weekdag 4 van een week is altijd hetzelfde jaar als het isojaar van die week

datediff(yy, 0, day4)

Bij het optellen van 3 dagen bij de eerste dag van het isojaar wordt een willekeurige dag van de eerste isoweek van het isojaar gevonden

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

relatieve week van de eerste isoweek van het isojaar vinden

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

Het vinden van de maandag minus 4 dagen van de eerste isoweek resulteert in de donderdag van de week VOOR de eerste dag van de eerste isoweek van het isojaar

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

Als je de eerste donderdag van de week voor de eerste isoweek en de eerste donderdag van de gekozen week weet, is het vrij eenvoudig om de week te berekenen, het maakt niet uit welke instellingsdatum het eerst heeft aangezien de weekdagen van beide datums donderdagen zijn.

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


  1. Een reeks getallen genereren in MySQL

  2. MariaDB ROW_COUNT() uitgelegd

  3. Verkeerd gecodeerde tekens krijgen bij het ophalen van waarden uit MySQL DB

  4. INET_ATON() en INET_NTOA() in PHP?