Я создал функцию в SQL, чтобы возвращать правильную дату из недели ISO в формате вроде «15W53». Где первая часть перед буквой «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;