2016-04-17 5 views
0

Я знаю, что есть другие сообщения с кодом, которые решают мою проблему, но я не хочу брать другой код, поэтому я пытаюсь сделать это сам, и я застрял с месяцем, не увеличивая проблемы, поэтому, если кто-нибудь может помочь мне с этой ошибкой, это будет потрясающе.Ошибка кода в SQL Server While-If Loop

Проблема заключается в том:

я должен заполнить временную таблицу с 1990 года до 2016 года всех месяцев и дней, я уже добился того, что код работает, и это правильно года и дней, но месяцы заселяет увеличивается до января (1), а затем не увеличивается, так что таблица заполняется все месяцы будучи января (LOL)

Вот мой код:

create table Time 
(
    Year int, 
    Month int, 
    Day int 
) 

create procedure pTime 
as 
    declare @year int, @month int, @day int; 
    set @year = 1990; 
    set @month = 12; 
    set @day = 10; 

while(@year<=2016) 
Begin 

    If(@day = 29) 
    Begin 

     set @month = @month + 1; 

     If(@month = 13) 
     Begin 

      set @month = 1; 
      set @day = 1; 
      set @year = @year + 1; 

      insert into Time values (@year, @month, @day); 
     End 
    End 

    else 
    Begin 
     If(@day = 29) 
     Begin 

      set @month = @month + 1; 
      set @day = 1; 

      insert into Time values (@year, @month, @day); 
     End 

     Else  
     Begin 

      insert into Time values (@year, @month, @day); 

      set @day = @day + 1; 
     End 
    End 
End 

Любая идея, где моя ошибка или любое предложение?

+0

«Пожалуйста, отлаживайте мой код», вопросы не особо приветствуются здесь. Я думаю, что ваш подход к решению проблемы не очень эффективен. Я предпочел бы использовать тип данных даты и функцию DateAdd. - Но поскольку вы хотите продолжить свой подход, внимательно посмотрите на условие If (@year = 29). – PhilS

+0

О, я пропустил это. Позвольте мне исправить это. Спасибо :) Я не хочу, чтобы сообщество отлаживало мой код, я просто искал какой-то намек на то, что мне не хватает, вот и все. – RalphVB

ответ

1

Зачем вам нужно If(@year = 29) состояние? В вашем коде этот блок никогда не будет выполнен. попробуйте это:

create procedure pTime 
as 
    declare @year int, @month int, @day int; 
    set @year = 1990; 
    set @month = 12; 
    set @day = 10; 

while(@year<=2016) 
Begin 
    If(@day = 29) 
    Begin 

     set @month = @month + 1; 
     set @day = 1; 

     If(@month = 13) 
     Begin 
      set @month = 1;    
      set @year = @year + 1; 
      insert into Time values (@year, @month, @day); 
     End 
    End 

    else 
    Begin 
     If(@day = 29) 
     Begin 

      set @month = @month + 1; 
      set @day = 1; 

      insert into Time values (@year, @month, @day); 
     End 

     Else  
     Begin 

      insert into Time values (@year, @month, @day); 

      set @day = @day + 1; 
     End 
    End 
End 

Я думаю, что первое назначение set @day = 1; не было в нужном месте. После увеличения значения @month вы также должны установить @day в 1;

+0

Это была моя ошибка, написав мой код здесь, я отредактировал этот пост, чтобы исправить его. – RalphVB

+0

Я отредактировал свой комментарий. пожалуйста, проверь это. –

+0

Позвольте мне проверить. – RalphVB

2

Я не очень внимательно смотрел на вашу ошибку, потому что SQL Server имеет некоторые полезные арифметические функции даты. Вот упрощенная версия хранимой процедуры:

create procedure pTime 
as 
    declare @theDate date = '12/10/1990', @days int = 0 

while @theDate < '1/1/2016' 
    begin 
    insert into Time (Year, Month, Day) values (datepart(year, @theDate), datepart(month, @theDate), datepart(day, @theDate)); 
    set @theDate = dateadd(day, 1, @theDate) 
    end 
+0

Вы f @ ckin 'БОГ. Это то, о чем я говорил, не отлаживая мой код, просто давая мне подсказки о том, как это сделать. Ты действительно классный, чувак. Я собираюсь изучить этот код. Большое спасибо, чувак: D – RalphVB

+0

Спасибо за похвалу, и вы всегда рады. Не стесняйтесь спрашивать, есть ли у вас вопросы. Пожалуйста, примите ответ, если он сработает для вас. – user212514

2

Еще один более быстрый подход - использовать таблицу подсчета. Обратите внимание на следующий код:

WITH 
E(N) AS (SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
     SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
     SELECT 1 UNION ALL SELECT 1), 
iTally(N) AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1))-1 FROM E a,E b,E c,E d,E e), 
dates(dt) AS 
(
    SELECT TOP(datediff(DAY,'19900101','20160101')) DATEADD(day,N,'19900101') 
    FROM iTally 
) 
--INSERT [time] --uncomment for the insert, leave commented to see what will be inserted 
SELECT YEAR(dt), MONTH(dt), DAY(dt) 
FROM dates; 
+0

Это самый быстрый способ сравнить с другими ответами – Eric

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