2013-11-27 3 views
0

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

У меня возникла проблема с частью инструкции if и 2 переменными, которые устанавливаются во втором операторе if. Я не вижу ничего плохого. Я знаю, что могу передать переменные в клиентском приложении и все это увидеть. Я так близок к этой работе, я бы хотел, чтобы она работала именно так.

Declare @CurrDate as date set @CurrDate = convert(datetime,'27/04/2013',103) 

Declare @ThisTimeLastYear as date set @ThisTimeLastYear = dateadd(year,-1,@currdate) 

Declare @LastYearCheck as date set @LastYearCheck = convert(datetime,cast(30 as varchar) + '/' + cast(6 as varchar) + '/' + cast(DATEPART (year,@currdate)-1 as varchar) ,103) 
Declare @SpringStartlastYear as date set @springStartlastYear = convert(datetime,'01/01/2012',103) 
Declare @AutWinterStartLastYear as date set @AutWinterStartLastYear = convert(datetime,cast(01 as varchar) + '/' + cast(07 as varchar) + '/' + cast(DATEPART (year,@currdate)-1 as varchar) ,103) 

Declare @springEndLastYear as date 
Declare @autumnEndLastYear as date 

if (@ThisTimeLastYear < @LastYearCheck) 
    set @springEndLastYear = @ThisTimeLastYear 
    /*this year hasn't reached the autumn/winter season so move date ranges out of the way +20 year */ 
    set @AutWinterStartLastYear = DATEADD(year,20,@AutWinterStartLastYear) 
    set @autumnEndLastYear = DATEADD(year,20,@autumnEndLastYear) 
if (@ThisTimeLastYear > @LastYearCheck) 
     set @springEndLastYear = @LastYearCheck 
set @autumnEndLastYear = @ThisTimeLastYear 

2 переменные во 2-й инструкции if изменяются, когда они не должны.

+1

Ваш отступ подразумевает, что вы хотите, чтобы несколько строк были предметом 'i f' - который требует, чтобы они были завернуты в 'begin' и' end'. если вы этого не сделаете - только строка, следующая за 'if', является условной - все последующие строки выполняются независимо от результата' if' – dav1dsm1th

+0

. Могли бы вы предоставить некоторые возможные входы и ожидаемые результаты? Я не уверен, что понимаю, что вы хотите вернуть именно этим скриптом. – Josien

+0

полностью забыл о начале конца !!!! спасибо – user2247671

ответ

0

попробовать: -

if (@ThisTimeLastYear < @LastYearCheck) begin 
    set @springEndLastYear = @ThisTimeLastYear 
    /*this year hasn't reached the autumn/winter season so move date ranges out of the way +20 year */ 
    set @AutWinterStartLastYear = DATEADD(year,20,@AutWinterStartLastYear) 
    set @autumnEndLastYear = DATEADD(year,20,@autumnEndLastYear) 
end 
if (@ThisTimeLastYear > @LastYearCheck) begin 
    set @springEndLastYear = @LastYearCheck 
    set @autumnEndLastYear = @ThisTimeLastYear 
end 

или (ваше состояние логики может потребоваться некоторое внимание): -

if (@ThisTimeLastYear < @LastYearCheck) begin 
    set @springEndLastYear = @ThisTimeLastYear 
    /*this year hasn't reached the autumn/winter season so move date ranges out of the way +20 year */ 
    set @AutWinterStartLastYear = DATEADD(year,20,@AutWinterStartLastYear) 
    set @autumnEndLastYear = DATEADD(year,20,@autumnEndLastYear) 
end else begin 
    set @springEndLastYear = @LastYearCheck 
    set @autumnEndLastYear = @ThisTimeLastYear 
end 
0

Вы можете использовать начать/конец, вот альтернатива: В TSQL Вы можете заполнить выведите несколько переменных в одну и ту же команду:

SELECT 
    @springEndLastYear = @ThisTimeLastYear, 
    @AutWinterStartLastYear = DATEADD(year,20,@AutWinterStartLastYear), 
    @autumnEndLastYear  = DATEADD(year,20,@autumnEndLastYear) 
WHERE @ThisTimeLastYear < @LastYearCheck 
SELECT 
    @springEndLastYear = @LastYearCheck, 
    @autumnEndLastYear = @ThisTimeLastYear 
WHERE @ThisTimeLastYear >= @LastYearCheck 
Смежные вопросы