Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Цикл по датам  [new]
folli
Member

Откуда:
Сообщений: 23
Всем доброго времени суток.
Столкнул с такой проблемой и что то совсем не могу понять почему не отрабатывает как положено.
Необходимо, что бы прибавлялся +1 день в цикле, то есть обработал селект по одной дате, прибавил +1 и снова пошел обрабатывать, но уже по след дню и так далее, до определенной даты. У меня получается, что только 1 день обрабатывается и все на это цикл заканчивается.
Буду весьма благодарен за любые ответы и подсказки.

declare 
@DateRest DateTime; 
declare
@i DateTime;
Set @DateRest = '20151001'
set @i = cast(convert(char(6),@DateRest,112)+'01' as datetime)
while @i <= '20151031'
begin
insert into AB_Test
select 

 .......

where @i between sld1002 and sld1003 and sld1004 <> 0
group by ass1001, ass1003, sld1003, tpr2011;
set @i = @i + 1;
break;
end
5 фев 16, 15:26    [18778131]     Ответить | Цитировать Сообщить модератору
 Re: Цикл по датам  [new]
Glory
Member

Откуда:
Сообщений: 104751
folli
Буду весьма благодарен за любые ответы и подсказки.

Просто не надо работать с типом DateTime как с integer. И все получится.
5 фев 16, 15:28    [18778146]     Ответить | Цитировать Сообщить модератору
 Re: Цикл по датам  [new]
xenix
Guest
а зачем так нестандартно?
DECLARE  @InStartDate DATE;
DECLARE  @InStopDate DATE;

SET @InStartDate='20150101';
SET @InStopDate='20151231';

WHILE(@InSTartDate<=@InStopDate)
  BEGIN
   --СЧИТАЕМ


  SELECT @InStartDate=DATEADD(DD,1,@InStartDate);
  
  END;
5 фев 16, 15:31    [18778164]     Ответить | Цитировать Сообщить модератору
 Re: Цикл по датам  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Небось, в sld1002 и sld1003 не только дата, но и время ненулевое есть?
Какого они типа, кстати, непонятно.
А в @i оно всегда нулевое.

Трудно понять, зачем вообще так делать.
Ну, надо так надо...

P.S. Прибавлять целую единицу к DATETIME - это, вообще говоря, некрасиво как-то.
Есть же DATEADD()
5 фев 16, 15:34    [18778186]     Ответить | Цитировать Сообщить модератору
 Re: Цикл по датам  [new]
folli
Member

Откуда:
Сообщений: 23
iap
Небось, в sld1002 и sld1003 не только дата, но и время ненулевое есть?
Какого они типа, кстати, непонятно.
А в @i оно всегда нулевое.

Трудно понять, зачем вообще так делать.
Ну, надо так надо...

P.S. Прибавлять целую единицу к DATETIME - это, вообще говоря, некрасиво как-то.
Есть же DATEADD()


Да, Вы правы, в sld1002 и sld1003 есть и нулевое время.
Я попробовал сделать по аналогии

DECLARE  @InStartDate DATE;
DECLARE  @InStopDate DATE;

SET @InStartDate='20150101';
SET @InStopDate='20151231';

WHILE(@InSTartDate<=@InStopDate)
  BEGIN
   --СЧИТАЕМ


  SELECT @InStartDate=DATEADD(DD,1,@InStartDate);
  
  END;


Результат тот же, он вытаскивает 1 день и на этом все заканчивается.
5 фев 16, 15:44    [18778263]     Ответить | Цитировать Сообщить модератору
 Re: Цикл по датам  [new]
Glory
Member

Откуда:
Сообщений: 104751
folli
Результат тот же, он вытаскивает 1 день и на этом все заканчивается.

Наверное потому, что ваш цикл срабатывает один раз ?
5 фев 16, 15:48    [18778288]     Ответить | Цитировать Сообщить модератору
 Re: Цикл по датам  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
folli
Результат тот же, он вытаскивает 1 день и на этом все заканчивается.

так может у вас данных нет или вы оставили свой BREAK как в стартовом посте
5 фев 16, 15:48    [18778292]     Ответить | Цитировать Сообщить модератору
 Re: Цикл по датам  [new]
aleks2
Guest
Glory
folli
Результат тот же, он вытаскивает 1 день и на этом все заканчивается.

Наверное потому, что ваш цикл срабатывает один раз ?

Нормально он срабатывает

DECLARE  @InStartDate DATE;
DECLARE  @InStopDate DATE;

SET @InStartDate='20150101';
SET @InStopDate='20151231';

WHILE( @InSTartDate <= @InStopDate ) BEGIN
   --СЧИТАЕМ


  SELECT @InStartDate=DATEADD(DD,1,@InStartDate);
  SELECT @InStartDate;
END;


PS. Тредстартеру следует завязать с этой имеративщиной.
5 фев 16, 15:51    [18778317]     Ответить | Цитировать Сообщить модератору
 Re: Цикл по датам  [new]
folli
Member

Откуда:
Сообщений: 23
aleks2
Glory
пропущено...

Наверное потому, что ваш цикл срабатывает один раз ?

Нормально он срабатывает

DECLARE  @InStartDate DATE;
DECLARE  @InStopDate DATE;

SET @InStartDate='20150101';
SET @InStopDate='20151231';

WHILE( @InSTartDate <= @InStopDate ) BEGIN
   --СЧИТАЕМ


  SELECT @InStartDate=DATEADD(DD,1,@InStartDate);
  SELECT @InStartDate;
END;


PS. Тредстартеру следует завязать с этой имеративщиной.


Может вы и правы, но я все же попробую, первые пару дней в sql кручусь, приходиться импровизировать.
5 фев 16, 17:06    [18778802]     Ответить | Цитировать Сообщить модератору
 Re: Цикл по датам  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
folli
приходиться импровизировать.

лучше документацию читайте - времени потратите меньше,а толку будет больше
5 фев 16, 17:07    [18778807]     Ответить | Цитировать Сообщить модератору
 Re: Цикл по датам  [new]
xenix
Guest
автор
Может вы и правы, но я все же попробую, первые пару дней в sql кручусь, приходиться импровизировать


ну тогда гуляем на всю катушку
DECLARE  @InStartDate DATE;
DECLARE  @InStopDate DATE;

SET @InStartDate='20150101';
SET @InStopDate='20151231';

WHILE(@InSTartDate<=@InStopDate)
  BEGIN
   --СЧИТАЕМ
   
  insert into AB_Test
select 

 .......

where @InSTartDate between CAST(sld1002 AS DATE) and CAST(sld1003 AS DATE) and sld1004 <> 0
group by ass1001, ass1003, sld1003, tpr2011

  SELECT @InStartDate=DATEADD(DD,1,@InStartDate);
  
  END;
5 фев 16, 17:27    [18778891]     Ответить | Цитировать Сообщить модератору
 Re: Цикл по датам  [new]
folli
Member

Откуда:
Сообщений: 23
Всех кто отозвался и помог благодарю.
Все получилось все работает.
Желаю всем удачи и хороших выходных.
5 фев 16, 17:33    [18778929]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить