Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Wrong week number using DATEPART in SQL Server

I've got the problem that

select datepart(ww, '20100208')

is returning as result week 7 in SQL Server 2000. But 08.02.2010 should be week 6 according to the ISO 8601 specification! This is causing problems in delivery week calculations.

What should I do to get week number values according to ISO 8601?

like image 776
MicSim Avatar asked Feb 08 '10 10:02

MicSim


People also ask

How do I get the current week number in SQL?

MySQL WEEK() Function The WEEK() function returns the week number for a given date (a number from 0 to 53).

Can you use Datepart in SQL?

The DATEPART SQL function returns an integer value of specific interval. We will see values for this in the upcoming section. Date: We specify the date to retrieve the specified interval value. We can specify direct values or use expressions to return values from the following data types.

How do I change the start of the week in SQL?

In SQL Server, there is a @@DATEFIRST function, which returns the current week start day (value of SET DATEFIRST). To change default week start day, we can set any week start day value between 1-7 to DATEFIRST. @@DATEFIRST is local to the session.

How do I get the week number between two dates in SQL Server?

In SQL Server, there's a buildin function to calculate the number of weeks between two dates. This function is called “DateDiff”.


1 Answers

You can do this within SQL 2008 very easily as it now supports isoww as the first datepart argument. However, this wasn't in SQL 2000 (or 2005). There is a function in this article which will do it for you in SQL 2000/2005.

In case the blog goes offline, here is the function. Go to the post to learn more about ISO and non-ISO weeks.

CREATE FUNCTION ISOweek  (@DATE datetime)
RETURNS int
AS
BEGIN
   DECLARE @ISOweek int
   SET @ISOweek= DATEPART(wk,@DATE)+1
      -DATEPART(wk,CAST(DATEPART(yy,@DATE) as CHAR(4))+'0104')
   --Special cases: Jan 1-3 may belong to the previous year
   IF (@ISOweek=0) 
      SET @ISOweek=dbo.ISOweek(CAST(DATEPART(yy,@DATE)-1 
         AS CHAR(4))+'12'+ CAST(24+DATEPART(DAY,@DATE) AS CHAR(2)))+1
   --Special case: Dec 29-31 may belong to the next year
   IF ((DATEPART(mm,@DATE)=12) AND 
      ((DATEPART(dd,@DATE)-DATEPART(dw,@DATE))>= 28))
      SET @ISOweek=1
   RETURN(@ISOweek)
END
like image 138
AdaTheDev Avatar answered Oct 12 '22 05:10

AdaTheDev