SQL 服务器:如何将 SAP 风格的 CALWEEK 转换为 CALMONTH?

SQL Server: how to convert SAP-style CALWEEK to CALMONTH?

2015 年有 53 周,2016 年有 52 周。因此,CALMONTH 不能通过周数除以四然后取上限来计算。 CALWEEK 报告如 201652201501201104。 CALMONTH 是介于 %YEAR%MONTH(例如 201501201512 之间的数字,表示 2015 年。

如何在 SQL Server 2014 中将 SAP 风格的 CALWEEK 转换为 CALMONTH?

也许我疯了,但我认为弄清楚这个问题很有趣。我不得不把绳子撕开,得到一周第一天的日期。然后找出月份并将其拼凑回一个字符串

CREATE TABLE #f(
  CALWEEK VARCHAR(10));

INSERT #f (CALWEEK)
VALUES ('201602'),('201606'),('201612'),('201624'),('201630'),
   ('201632'),('201650'),('201652'),('201701'),('201706'),('201715');


SELECT CALWEEK,
    --GETTING THE YEAR
    CAST(DATEPART(yyyy,DATEADD(wk,DATEDIFF(wk,6,'1/1/' + 
    SUBSTRING(CALWEEK,1,4)) +
    (SUBSTRING(CALWEEK,5,6)-1), 6))AS VARCHAR(4))+
    --GETTING THE MONTH
    CASE WHEN LEN(
    CAST(DATEPART(mm,DATEADD(wk,DATEDIFF(wk,6,'1/1/' + 
    SUBSTRING(CALWEEK,1,4)) +
    (SUBSTRING(CALWEEK,5,6)-1), 6)) AS VARCHAR(2))) = 1 
    THEN '0' + CAST(DATEPART(mm,DATEADD(wk,DATEDIFF(wk,6,'1/1/' + 
    SUBSTRING(CALWEEK,1,4)) +
    (SUBSTRING(CALWEEK,5,6)-1), 6)) AS VARCHAR(2))
    ELSE CAST(DATEPART(mm,DATEADD(wk,DATEDIFF(wk,6,'1/1/' + 
    SUBSTRING(CALWEEK,1,4)) +
    (SUBSTRING(CALWEEK,5,6)-1), 6)) AS VARCHAR(2)) END AS 'CALMONTH'
FROM #f

DROP TABLE #f