【发布时间】:2018-02-25 01:45:18
【问题描述】:
我在 SQL 中创建了一个函数,以从“15W53”之类的格式返回 ISO 周的正确日期。其中“W”之前的第一部分是年份编号,后半部分是周编号。返回的日期应返回该日期的星期开始。
例如,15W53 应返回 12-28-2015,16W01 应返回 01-04-2016。但是,如果我为以下示例运行此程序,从我所读到的关于 ISO 周的内容中,我会得到不正确的结果。
我是否错误地创建了解析日期的函数?
SET DATEFIRST 1;
SELECT dbo.[GetDateFromISOweek]('15W52') AS Correct, '15W52' -- Returns: 2015-12-21
SELECT dbo.[GetDateFromISOweek]('15W53') AS Correct, '15W53' -- Returns: 2015-12-28
SELECT dbo.[GetDateFromISOweek]('16W01') AS Incorrect, '16W01'-- Returns: 2015-12-28
SELECT dbo.[GetDateFromISOweek]('16W02') AS Incorrect, '16W02'-- Returns: 2016-01-04
SELECT dbo.[GetDateFromISOweek]('16W03') AS Incorrect, '16W03'-- Returns: 2016-01-11
功能:
CREATE FUNCTION [dbo].[GetDateFromISOweek] (@Input VARCHAR(10))
RETURNS DATETIME
WITH EXECUTE AS CALLER
AS
BEGIN
DECLARE @YearNum CHAR(4)
DECLARE @WeekNum VARCHAR(2)
SET @YearNum = SUBSTRING(@Input,0,CHARINDEX('W',@Input,0))
SET @WeekNum = SUBSTRING(@Input,CHARINDEX('W',@Input,0)+1,LEN(@Input))
RETURN(DATEADD(wk, DATEDIFF(wk, 6, '1/1/' + @YearNum) + (@WeekNum-1), 7));
END;
【问题讨论】:
-
我的建议是,任何时候你需要编写一个函数来计算一个日期,你应该考虑创建一个日期维度表。它会让你的生活轻松 1000%。 mssqltips.com/sqlservertip/4054/…
-
嘿肖恩,这是个好主意!感谢您的链接!
标签: sql iso date-parsing