2015-04-21 2 views
2

Я хочу получить полный ISOweek года с 1 января до 52-й недели года.Как получить ISOweek и дату начала и окончания каждой недели в течение всего года с использованием сервера sql

, и я хочу получить начальную и конечную дату каждую неделю.

У меня есть сценарий здесь, но я не получаю выход, который я хочу

Сценарий:

Declare @starttime datetime 
Declare @endtime datetime 
Set @starttime = '2015-01-01 10:50:29.293' 
Set @endtime = '2015-12-31 10:50:29.293' 

declare @time datetime 
while @endtime > @starttime 
begin 

print DATEPART(Week,@starttime) 
print @starttime 
set @time = DATEADD(DAY, 6,@starttime) 
If @time<@endtime 
Begin 

    print @time 
    print DATEPART(Week,@time) 

    set @starttime = DATEADD(DAY, 1,@time) 
End 
Else 
begin 
    print @endtime 
    print DATEPART(Week,@endtime) 
    set @endtime = @starttime 
End 
end 

Выход:

1 --> this is the week of the @Starttime 
Jan 1 2015 10:50AM -->@starttime 
Jan 7 2015 10:50AM -->@endtime 
2 --> this is the week of the endtime 

.... ...........

51 
Dec 17 2015 10:50AM 
Dec 23 2015 10:50AM 
52 
52 
Dec 24 2015 10:50AM 
Dec 30 2015 10:50AM 
53 

до конца года.

Я хочу, чтобы мой выход, чтобы быть, как это

образца:

1 --> this is the week of the @Starttime 
Jan 1 2015 10:50AM -->@starttime 
Jan 3 2015 10:50AM -->@endtime 
1 --> this is the week of the @endtime 

Я хочу мой время_запуска быть firstdate моей недели и моей EndTime быть lastdate из неделя до конца года.

Не могли бы вы помочь мне в этом?

ответ

2

Вы можете использовать DATEPART с WEEKDAY, чтобы получить день недели, а затем использовать рекурсивный КТР для получения последующих недель. Что-то вроде этого

DECLARE @dtstart DATETIME= '20150101' 
DECLARE @dtend DATETIME= '20151231' 

;WITH CTE AS 
(
SELECT 1 as WeekNo, @dtstart weekstart,DATEADD(d,6-DATEPART(WEEKDAY,@dtstart),@dtstart) weekend 
UNION ALL 
SELECT CTE.WeekNo + 1 as WeekNo, DATEADD(d,1,CTE.weekend),CASE WHEN DATEADD(d,7,CTE.weekend) < @dtend THEN DATEADD(d,7,CTE.weekend) ELSE @dtend END 
FROM CTE WHERE DATEADD(d,1,CTE.weekend) < @dtend 
) 
SELECT * FROM CTE; 
+0

Спасибо за идею. Бог благословил :) – Novice

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