SQL Get “ISO Year” for ISO Week

后端 未结 4 2053
悲&欢浪女
悲&欢浪女 2021-01-05 04:34

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 t

相关标签:
4条回答
  • 2021-01-05 04:59

    This is the most compact solution I could come up with:

    CASE
        WHEN DATEPART(ISO_WEEK, @Date) > 50 AND MONTH(@Date) = 1 THEN YEAR(@Date) - 1
        WHEN DATEPART(ISO_WEEK, @Date) = 1 AND MONTH(@Date) = 12 THEN YEAR(@Date) + 1
        ELSE YEAR(@Date) END
    

    Can be used directly inside a SELECT statement. Or you could consider creating a user-defined function that takes the @Date parameter as input and outputs the result of the case statement.

    0 讨论(0)
  • 2021-01-05 05:04

    This solution 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

    0 讨论(0)
  • 2021-01-05 05:07
    DECLARE @date DATETIME
    SET @date='2014-12-29'
    SELECT 
    CASE --Covers logic for ISO week date system which is part of the ISO 8601 date and time standard.  Ref: https://en.wikipedia.org/wiki/ISO_week_date
      WHEN (DATEPART(ISO_WEEK,@date) = 53) AND (DATEPART(MONTH,@date) = 1)
        THEN CAST((DATEPART(YEAR, @date) - 1) AS varchar(4)) + ('-W') + CAST (RIGHT('0' + CAST(DATEPART(ISO_WEEK,@date) AS varchar(2)),2) AS varchar(2))
      WHEN (DATEPART(ISO_WEEK,@date) = 1) AND (DATEPART(MONTH,@date) = 12)
        THEN CAST((DATEPART(YEAR,@date) + 1) AS varchar(4)) + ('-W') + CAST (RIGHT('0' + CAST(DATEPART(ISO_WEEK,@date) AS varchar(2)),2) AS varchar(2))
      ELSE CAST(DATEPART(YEAR,@date) AS varchar(4)) + ('-W') + CAST (RIGHT('0' + CAST(DATEPART(ISO_WEEK,@date) AS varchar(2)),2) AS varchar(2))
     END AS ISO_week
    
    0 讨论(0)
  • 2021-01-05 05:10

    For IsoYear, get the Thursday from IsoWeek, and then get the year.

    0 讨论(0)
提交回复
热议问题