2016-01-06 5 views
0

Как бы я тогда получить эквивалент прошлогоднего для обоего:Прошлогодних на дату по дням недели

Предыдущих недель даты понедельников в прошлом году Предыдущих недель дату воскресенья в прошлом году

на основе значение я получил для:

--start прошлой недели в этом году

SELECT DATEADD(wk, DATEDIFF(wk, 6, GETDATE()), 0) 

--end прошлой недели в этом году

SELECT DATEADD(wk, DATEDIFF(wk, 6, GETDATE()), 6) 

Итак, основываясь на текущей дате (06/01/2016) я получаю в этом году:

Предыдущая дата понедельники в этом году = 28/12/2015

Предыдущая воскресенье дата в этом году = 03/01/2016

Я хотел бы достичь:

Предыдущая дата понедельники в прошлом году = дата 29/12/2014
Предыдущие воскресенье в прошлом году = 04/01/2015

Где синтаксис будет заботиться года выпуска високосный каждые 4 года.

Благодаря

+0

Sql-Server-2008 – beatrice1711

+1

Можете ли вы дать несколько примеров, с особым вниманием к границам например ваш первый код, для меня, кажется, переход между субботами и воскресеньями - если вы попросите «на прошлой неделе», когда сегодняшняя дата - 2016-01-03, она вернется с 2015 по 2015 год - 2016-01-03, I.e. диапазон, который включает текущее воскресенье. Это верно? –

+1

Вы просите даты начала и конца недели до недели в прошлом году с тем же номером, что и текущая неделя в этом году? если да, то что-то подобное может работать? 'SET DATEFIRST 2 SELECT DATEADD (НЕДЕЛЯ, DATEPART (Wk, DATEADD (wk, DATEDIFF (wk, 6, GETDATE()), 0)) - 1, DATEADD (YEAR, -1, GETDATE())) AS PreviousMonday' –

ответ

0
SELECT DATEADD(wk, DATEDIFF(wk, 6, dateadd(year,-1,GETDATE())), 0) as 'Previous monday date last year ' 


SELECT DATEADD(wk, DATEDIFF(wk, 6, dateadd(year,-1,GETDATE())), 6) as 'Previous Sundays date last year ' 
+0

Спасибо за это. Кажется, он все еще не разбирается в выпуске високосного года. Я изменил getdate() на DECLARE @testdate datetime; SET @ testdate = '20160229, теперь я получаю предыдущий понедельник, последний год =' 2015-02-16 'и предыдущее воскресенье, в прошлом году =' 2015-02-22 ', но я бы подумал, что это будет «2015- 03-02 'и' 2015-03-08 'соответственно. Изменение @ testdate = '20160222' дает мне те же ответы, что и «20160229», что верно для testdate '20160222', но неправильно для '20160229'. Изменение @ testdate = 20160307 получает меня «2015-02-23» и «2015-03-01», но я думал, что должен получить «2015-03-09» и «2015-03-15». – beatrice1711

+0

Я изменил его на нижеследующее и, похоже, сработал - начало прошлой недели SELECT cast (DATEADD (wk, DATEDIFF (wk, 6, dateadd (неделя, -52, @ testdate)), 0) в качестве даты) --end прошлой недели SELECT CAST (DATEADD (WK, DATEDIFF (WK, 6, DateAdd (неделя, -52, @ testdate)), 6) в качестве даты) – beatrice1711

+0

@ beatrice1711 - Я особенно удивлен ваш «вход» - «20160307», вывод «2015-03-09» и «2015-03-15»), поскольку они, похоже, являются «будущей датой» с прошлого года. Вот почему я попросил вас усовершенствовать ваш вопрос и добавить несколько сработанных примеров, чтобы мы могли четко понимать ваши требования. Ленточные дни могут быть проблематичными, но есть так много способов, которыми вы можете: * хотеть иметь дело с ними, что просто сказать «сортировать выпуск високосного года» не дает нам достаточного руководства. –

0
SELECT DATEADD(wk, DATEDIFF(wk, 6, dateadd(year,-1,GETDATE())), 0) as 'Previous monday date ' 


SELECT DATEADD(wk, DATEDIFF(wk, 6, dateadd(year,-1,GETDATE())), 6) as 'Previous Sundays date ' 

его слишком просто

+0

Какая польза от вашего запроса, если мы соберем его с помощью запроса @ G.Nagababu. оба запроса имеют одинаковый синтаксис SQL. –