@alexanderukader

Как правильно использовать цикл WHILE в SQL?

Добрый день. Проблема в следующем.
Нужно определить:
1)Порядковый номер дня в календарном году
2)Название дня
3)Порядковый номер недели в календарном месяце
4)Порядковый номер месяца в календарном году
5)Порядковый номер квартала в календарном году
На несколько лет. Например с 1600-1605
Делал так:
DECLARE @Year VARCHAR (50)
DECLARE @EndYear VARCHAR (50)
SET @Year = '02/02/2002'
SET @EndYear = '01/31/2014'
SET LANGUAGE Russian
while (@Year <= @EndYear)
BEGIN
SELECT CAST(convert(char(8),@Year,112) as datetime)							        AS 'CalendarYear',
	   DATENAME(month, @Year)											            AS 'Month Name', 
	   DATEPART(DAYOFYEAR,@Year)											        AS 'NumberDayInCalendarYear',
	   DATEPART(QUARTER, @Year)												        AS 'NumverOfQuarter',
	   DATEPART(MONTH, @Year)													    AS 'NubmerMounthInCalendarYear',
	   DATEPART(WEEK, @Year)														AS 'NumberOfWeekInCalendarYear',
	   CAST(convert(char(6),@Year,112)+'01' as datetime)							AS 'CalendarMonthStartDate',
	   DATEADD(day,-1, CONVERT(char(6), DATEADD(MONTH,1,@Year),112)+'01')			AS 'CalendarMonthEndDate'
	   
END

Однако, это получается бесконечный цикл. Как правльно сделать через цикл?
Заранее спасибо!
  • Вопрос задан
  • 5749 просмотров
Пригласить эксперта
Ответы на вопрос 2
@pihel
Sql, Oracle, pl/sql, BI, ETL, php, olap
Я бы лучше сделал без цикла:
* иерархическим запросом сделал бы таблицу с годами
В oracle это так:
select level from dual
connect by level < 2000

* Приджойнил бы эту таблицу к вашему запросу

Плюсом - скорость, т.к. нет никаких процедур.
Ответ написан
Комментировать
Fadmin
@Fadmin
Чтобы цикл не был бесконечен, вставьте в тело цикла (перед end) что то типа
SET @Year = dateadd(d, 1, @Year )
вобщем смысл в том чтобы переменная которую вы проверяете в условии while (@Year <= @EndYear) имела приращение при каждой итерации цикла.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы