2014-01-07 4 views
3

У меня есть следующая проблема:получить месяц от календарной недели (SQL Server)

В компании Microsoft SQL Server, у меня есть таблица, где год и календарь недели (начиная с понедельника) хранится. Теперь я хочу написать функцию, которая возвращает месяц, в который начинается эта календарная неделя (т. Е. Если понедельник - 31 июля, он должен вернуть «7»). Я не нашел встроенной функции для достижения этой задачи, и я не имею понятия, чтобы реализовать это легко. Поэтому я надеюсь на вашу помощь и идеи!

Спасибо заранее, Melvin

+0

Вы могли бы хотеть попробовать 'MONTH' – Zane

+1

Пожалуйста, покажите, как значения сохраняются в таблице. – peterm

+0

См. Ответ от М.Али, он предоставил мне такое решение. –

ответ

1

Запрос

DECLARE @WEEK INT; 
DECLARE @YEAR INT; 
SET @week = 3 
SET @year = 2014 

SELECT DATEPART(MM,CAST(CONVERT(CHAR(3), 
       DATEADD(WW,@WEEK - 1, 
       CONVERT(datetime,'01/01/'+CONVERT(char(4),@Year))) 
       ,100)+ ' 1900' AS DATETIME)) AS [MONTH] 

Результат

╔═══════╗ 
║ MONTH ║ 
╠═══════╣ 
║  1 ║ 
╚═══════╝ 
+0

Спасибо, это почти решение. Но вместо '01/01/'+ CONVERT (char (4), @ Year) Мне нужен «настоящий» первый день года (ISO), но я думаю, что смогу это сделать для себя, поэтому я установил это как решение. –

+0

Без проблем рад, что это помогло :) –

1

Отредактировано: мне пришлось перечитать ответ и вытащить из M.Ali, чтобы получить полный ответ. Вы также должны знать правильный год, если первая неделя начнется в предыдущем году. Вы, возможно, потребуется сделать некоторые изменения, если ваша первая неделя года не обязательно включает в себя 1 января

DECLARE @Week int, @Year int, @Date datetime; 

SET @Week = 1 
SET @Year = 2014 
SET @Date = CAST(@Year as varchar(4)) + '-01-01' 
SELECT @Date = DATEADD(ww, @week-1, @Date) 

SELECT MONTH(DATEADD(d, (DATEPART(dw,@date)-2)*-1, @date)), 
    CASE WHEN @Week = 1 AND MONTH(DATEADD(d, (DATEPART(dw,@date)-2)*-1, @date)) = 12 
    THEN @YEAR - 1 ELSE @YEAR END as CorrectYear 
+0

Это может быть полное решение, но завтра я проведу некоторые тесты для особых случаев, чтобы убедиться, что он работает правильно. Спасибо!! –

Смежные вопросы