Как я могу преобразовать YYWW в формат даты на основе дня [Например: дата понедельника в заданном YYWW] в SqlServer? - PullRequest
0 голосов
/ 22 ноября 2018

В моей таблице есть столбец в формате YYWW.Мне нужно преобразовать это YYWW и получить дату понедельника.

Например:

Input YYWW: 1847
Expected Output: 2018-11-19 [Monday's date in 2018 Week 47]

Заранее спасибо

Я пробовал ниже, но не работает должным образом

declare @value int = 1519
SELECT CONVERT(VARCHAR(10), DATEADD(YEAR, 2000 + @value / 100-1900, 7 * (@value % 100)-7), 105);   



1851 -Expected 17-12-2018[Monday] Works fine for this year 2018

1752 -Expected 25-12-2017[Monday] but shows 24-12-2017 [Sunday]

1652 -Expected 26-12-2016 [Monday] but shows 24-12-2016 [Saturday]

1519 -Expected 04-05-2015 [Monday] but shows 07-05-2015  [Thursday]

Ответы [ 3 ]

0 голосов
/ 22 ноября 2018

Лично я бы использовал таблицу календаря .Тогда вы можете сделать что-то вроде:

SELECT YT.YYWW,
       CT.[date]
FROM YourTable YT
     JOIN CalendarTable CT ON CT.[Year] = '20'+LEFT(YT.YYWW,2)
                          AND CT.WeekNo = RIGHT(YT.YYWW,2)
                          AND CT.DayOfWeek = 1; --Assumes Monday is day 1.
0 голосов
/ 22 ноября 2018

Я думаю, что ваш расчет может быть не на 47-й неделе 2018 года, которая начинается 2018-11-26, то есть в понедельник.

в любом случае должно работать следующее, если вы не согласны с вышесказанным, просто вычтите 1 изколичество недель

DECLARE @Date date
DECLARE @Year int = 2000 +18
declare @week int = 47

SET @Date = DATEADD(YEAR, @Year - 1900, 0)

SELECT dateadd(ww,@week-1,DATEADD(DAY, (@@DATEFIRST - DATEPART(WEEKDAY, @Date) +  (8 - @@DATEFIRST) * 2) % 7, @Date))
0 голосов
/ 22 ноября 2018

Попробуйте:

DECLARE @t table(YYWW char(4))
INSERT @t values('1847'),('1752'),('1652'),('1519')

SELECT 
  CAST(DATEADD(wk,RIGHT(YYWW,2)+DATEDIFF(d,0,DATEADD(
       d,-4,LEFT(YYWW,2)+'0101'))/7,0) as date)
FROM @t

Результат:

2018-11-19
2017-12-25
2016-12-26
2015-05-04

РЕДАКТИРОВАТЬ:

Чтобы получить запрошенный формат ДД-ММ-ГГГГ:

SELECT 
  CONVERT(CHAR(10),DATEADD(wk,RIGHT(YYWW,2)+DATEDIFF(d,0,DATEADD(
       d,-4,LEFT(YYWW,2)+'0101'))/7,0),105)
FROM @t
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...