2015-07-10 1 views

ответ

0

с выражением вы получите последний понедельник:

CAST(GETDATE()-(@@DATEFIRST-1+DATEPART(weekday,GETDATE())) % 7+1 AS DATE) 

Здесь мы используем @@DATEFIRST и DATEPART(weekday,...), чтобы найти последнюю ПОНЕДЕЛЬНИК.

Затем вы должны сгенерировать 8 (два месяца) строк последовательности дней каждый из них за 7 дней до следующего. Здесь я использовал CTE, но вы можете использовать UNION или TOP 8 строк из существующей (системы или пользователя) в вашей таблице DB для генерации 8 строк.

;WITH CT(n) AS 
(
    SELECT 0 
    UNION ALL 
    SELECT n+1 FROM CT WHERE n < 7 
) 
SELECT DATEADD(DAY,-n*7, 
     CAST(GETDATE()- 
      (@@DATEFIRST-1+DATEPART(weekday,GETDATE())) % 7+1 AS DATE)) as DT 
FROM CT ORDER BY n 

Sqlfiddle demo

+0

Благодаря Valex, ваш пример также помочь мне в понимании рекурсивное ОТВ – user2435783

0

Try это

;WITH dates AS 
(
    SELECT CONVERT(datetime,cast(month(getdate())-2 as varchar(2))+'/'+cast(day(getdate()) as varchar(2))+'/'+ cast(year(getdate()) as varchar(4))) as Date,' ' as eid 
    UNION ALL 
    SELECT DATEADD(d,1,[Date]),' ' as eid 
    FROM dates 
    WHERE DATE < GETDATE() 
) 
select datename(DD,dates.date)+' '+datename(MM,dates.date)+' '+ datename(YYYY,dates.date) from dates 
where datename(dw,dates.date) = 'Monday' 
+0

Благодаря Simarjeet – user2435783