2016-06-13 4 views
2

Я хочу получить значение месяца, используя неделю. У меня есть номер недели, хранящийся в таблице с годовым значением.Как получить значение месяца с использованием значения недели sql server

enter image description here

Как запросить базу данных, чтобы получить значение месяца с помощью этой недели значение.

Я использую SQL

+0

Какую версию сервера sql вы используете? –

+0

Microsoft SQL Server 2008 – ManiMuthuPandi

+0

Используйте функцию [DateAdd] (https://technet.microsoft.com/en-us/library/ms186819 (v = sql.110) .aspx)! –

ответ

2

Вы можете попробовать это:

SELECT DATEPART(m,DATEADD(wk, DATEDIFF(wk, 6, '1/1/' + CAST(t.year as VARCHAR(4))) + (t.week-1), 6)) 
+0

Я согласен с этим, хотя в воскресенье начинается неделя, которая показывает неделю 6 как месяц 1, а не 2 (2016-02-01 против 2016-01-31) –

+0

Я получаю эту ошибку: при преобразовании значения varchar '1/1 /' в тип данных int – ManiMuthuPandi

+0

@ManiMuthuPandi О его целочисленный столбец? Попробуйте сейчас, я добавил 'CAST' – sagi

1

Это зависит от того, как вы причислять вашу неделю номер, к примеру, если мы предположим, что номер недели начинается с понедельника, то мы должны сказать, что 1-я неделя в 2016 году действительно началась в понедельник 28 декабря 2015 года и завершилась в воскресенье 3 января 2016 года. Если это так, как настроены номера вашей недели, вы можете использовать метод ниже

Примеры данных ;

CREATE TABLE #DateTable (WeekNum int, YearNum int) 
INSERT INTO #DateTable (WeekNum, YearNum) 
VALUES 
(1,2016) 
,(2,2016) 
,(3,2016) 
,(4,2016) 
,(5,2016) 
,(6,2016) 
,(7,2016) 

Затем мы укажем неделю и год на дату, а затем преобразуем это в месяц;

SELECT 
WeekNum 
,YearNum 
,DATEADD(wk, DATEDIFF(wk, 7, '1/1/' + CONVERT(varchar(4),YearNum)) + (WeekNum-1), 7) AS WeekStart 
,DATEPART(mm,DATEADD(wk, DATEDIFF(wk, 7, '1/1/' + CONVERT(varchar(4),YearNum)) + (WeekNum-1), 7)) MonthNum 

(Edit: обновлены источник INT)

дает эти результаты;

WeekNum YearNum WeekStart     MonthNum 
1  2016 2015-12-28 00:00:00.000  12 
2  2016 2016-01-04 00:00:00.000  1 
3  2016 2016-01-11 00:00:00.000  1 
4  2016 2016-01-18 00:00:00.000  1 
5  2016 2016-01-25 00:00:00.000  1 
6  2016 2016-02-01 00:00:00.000  2 
7  2016 2016-02-08 00:00:00.000  2 
0

Вы можете попробовать ниже запрос:

SELECT 
    [Week], 
    [Year], 
    'Output-Month' = MONTH(DATEADD(WEEK, [Week], DATEADD(WEEK, DATEDIFF(WEEK, '19050101', '01/01/' + CAST([Year] AS VARCHAR(4))), '19050101'))) 
FROM YourTable 

первым, чтобы получить 1-й день года, используя это:

DATEADD(WEEK, DATEDIFF(WEEK, '19050101', '01/01/' + CAST([Year] AS VARCHAR(4))), '19050101') 

второй является, чтобы добавить номер недели с помощью это:

DATEADD(WEEK, [Week], 'From 1st result') 

Last is ge tting число месяцев, используя функцию MONTH.

0

Вы не можете перейти от номера недели в месяц, потому что недели могут происходить в два разных месяца. Например, 31 января 2016 года и 1 февраля 2016 года находятся на неделе 6.

SELECT DATEPART(WEEK, '2016-01-31') 
SELECT DATEPART(WEEK, '2016-02-01') 
Смежные вопросы