SQL 服务器:如何将 SAP 风格的 CALWEEK 转换为 CALMONTH?
SQL Server: how to convert SAP-style CALWEEK to CALMONTH?
2015 年有 53 周,2016 年有 52 周。因此,CALMONTH 不能通过周数除以四然后取上限来计算。 CALWEEK 报告如 201652
、201501
和 201104
。 CALMONTH 是介于 %YEAR%MONTH
(例如 201501
和 201512
之间的数字,表示 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
2015 年有 53 周,2016 年有 52 周。因此,CALMONTH 不能通过周数除以四然后取上限来计算。 CALWEEK 报告如 201652
、201501
和 201104
。 CALMONTH 是介于 %YEAR%MONTH
(例如 201501
和 201512
之间的数字,表示 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