Home > Mobile >  SQL - How to get the Year-Week using the ISO weeks?
SQL - How to get the Year-Week using the ISO weeks?

Time:10-29

I would like to get a year number - week number (f.i. 2021-01) using the ISO weeks count. I did manage to get both of them seperate using the following code:

IsoWeek:

(datepart(ISOWK, [Date])) 

IsoYearNumber:

YEAR(DATEADD(day, 26 - DATEPART(isoww, [Date]), [Date]))

However, when I try to combine them into the YYYY-WW format using the line below I will get strange values like 2073 for 2020 WK 53.

(YEAR(DATEADD(day, 26 - DATEPART(isoww, [Date]), [Date])))   '-'   (datepart(ISOWK, [Date])) 

What should I change in the line above to get the ISO Year and Week in the YYYY-WW format? Thanks for the help in advance!

CodePudding user response:

Use the CONCAT function. is both the addition operator and concatenation operator in T-SQL; which is it inferred to be depends on the data that surrounds it. Here it is being inferred as a plus operator, not a concatenation operator, as the data in the query are int values, and the '-' is therefore being implicitly converted to an int too ('-' as an int is 0).

If we use the current date we have the expression below:

(YEAR(DATEADD(day, 26 - DATEPART(isoww, '20211028'), '20211028')))   '-'   (datepart(ISOWK, '20211028'))

Which returns 2064. That's because it resolves to 2021 '-' 43 = 2021 0 43 = 2064.

If you use CONCAT you get what you want, which implicitly converts each value to a string based data type first:

SELECT CONCAT((YEAR(DATEADD(day, 26 - DATEPART(ISOWEEK, '20211028'), '20211028'))), '-', (DATEPART(ISOWEEK, '20211028')));

I also make your casing consistent and use the same keyword for the date part, ISOWEEK, as you you inconsistently use isoww and ISOWK.

  • Related