Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SQL Get "ISO Year" for ISO Week

I need to calculate the year a week is assigned to. For example the 29th december of 2003 was assigned to week one of year 2004 (this is only for europe, I think). You can take a look at this with this code:

SELECT DATEPART(isowk, '20141229');

But now I need an easy way to get the year this week is assigned to. What I currently do is not that elegant:

DECLARE @week int, @year int, @date char(8)

--set @date = '20150101'
set @date = '20141229'


SET @week = cast(datepart(isowk, @date) as int)

if @week = 1
begin
      if DATEPART(MONTH, @date) = 12
      begin
            set @year = DATEPART(year, @date) + 1
      end
      else
      begin
            set @year = DATEPART(year, @date)
      end
end

select @date "DATE", @week "WEEK", @year "YEAR"

If anybody knew a more elegant way, that would be nice :-)

like image 724
Romano Zumbé Avatar asked Nov 14 '14 09:11

Romano Zumbé


People also ask

How do I get ISO week in SQL?

If you need to extract the ISO week number from a date in SQL Server, you can use the iso_week argument when calling the DATEPART() function. You can alternatively use the isowk or isoww arguments to do the same thing.

How is ISO week calculated?

The ISO calendar date consists of three parts: year (almost the same as a Gregorian year), week number (1-53), and day within a week (1-7). The first week of a year is the week of the first Thursday. The last week is the week immediately before the first week of the next year. Every week starts on Monday.

How do I get the year and week number from a date in SQL?

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

What is ISO week in SQL?

The week number can be described by counting the Thursdays: week 12 contains the 12th Thursday of the year. The ISO year starts at the first day (Monday) of week 01 and ends at the Sunday before the new ISO year (hence without overlap or gap). It consists of 52 or 53 full weeks.


1 Answers

This solution The code in the question does not return the correct value for the date '1-1-2027'.

The following will return the correct value with all dates i tested (and i tested quite a few).

SELECT YEAR(DATEADD(day, 26 - DATEPART(isoww, '2012-01-01'), '2012-01-01'))

As taken from: https://capens.net/content/sql-year-iso-week

like image 157
nilla Avatar answered Oct 13 '22 18:10

nilla