Как использовать условие if в запросе выбора? - PullRequest
0 голосов
/ 21 апреля 2019

В моей таблице есть столбцы даты начала и окончания, и в качестве входных данных я получаю дату начала и окончания.Мне нужно установить дату начала как TBL.StartDate, если это после даты начала INPUT, и мне нужно установить дату окончания как TBL.EndDate, если это до даты окончания INPUT.Наконец, посчитайте дни между START и END.

Я пытаюсь использовать оператор if, но не могу выполнить запрос if в запросе выбора.

Я не уверен, что это такправильный способ решения этой проблемы.

Declare @Start Date;
Declare @End Date;
Declare @INPUT_StartDate Date;
Declare @INPUT_EndDate Date;

set @INPUT_StartDate = '2019-01-01'; --user input
set @INPUT_EndDate = '2019-04-20'; --user input

select 
TBL.StartDate, 
TBL.EndDate, 
@INPUT_StartDate, 
@INPUT_EndDate,
if(TBL.StartDate < INPUT_StartDate) set @Start = TBL.STARTDate;
else set @Start = INPUT_StartDate;
if(TBL.EndDate < INPUT_EndDate) set @End = INPUT_EndDate;
else set @End = TBL.EndDate;
@DateDiff(day, @Start, @End) as COUNT
 from TBL

Я ожидаю, что это сравнение произойдет, но я предполагаю, что я использую, если утверждение между запросом выбора не разрешено?

Actualрезультаты довольно много синтаксических ошибок рядом с if.

Ответы [ 3 ]

0 голосов
/ 21 апреля 2019

SQL Server не имеет least() или greatest().И SQL Server не позволяет смешивать выбранные столбцы с переменными установки.

Я рекомендую устанавливать значения в «подзапросе», в этом случае, используя apply:

select t.StartDate,  t.EndDate, 
       @INPUT_StartDate, @INPUT_EndDate,
       DateDiff(day, v.dateStart, v.dateEnd) as num_days
from tbl t cross apply
     (values (case when t.StartDate < @INPUT_StartDate
                   then t.STARTDate
                   else @INPUT_StartDate
              end,
              case when t.EndDate < @INPUT_EndDate
                   then INPUT_EndDate
                   else @TBL.EndDate
              end
             )
     ) v(startDate, endDate);
0 голосов
/ 22 апреля 2019
declare @StartDate datetime,@msg varchar(100),@Diff int
declare @EndDate datetime
declare @TodayDate datetime
set @StartDate = '2019-04-23'    ---Define Start Date-----
set @EndDate = '2019-04-30'      ---Define End Date-----
set @TodayDate = GETDATE()
            if(@StartDate < @TodayDate)
            begin
            set @msg = 'Date is Smaller than today date'
            select @msg
            end
                    else
                    begin
                    select @Diff = DATEDIFF(day,@StartDate,@EndDate)
                    set @msg = @Diff
                    select @msg as Days_Differance
            end

enter image description here

0 голосов
/ 21 апреля 2019

Вы можете удостовериться в операторе case, который такой же, как если бы, но использовался в операторе case. если вы хотите использовать, если в списке выбора (есть IIF, если ваш сервер SQL 2012+). Если в основном используется в условной логике.

Я удалил переменные @start и @end date, которые могут не требоваться в зависимости от используемой вами логики.

select  '2019-03-20' as startdate, '2019-04-20' as ENddate into #temp union all 
select  '2018-02-01' as startdate, '2019-03-20' as ENddate   



    Declare @Start Date;
Declare @End Date;
Declare @INPUT_StartDate Date;
Declare @INPUT_EndDate Date;

set @INPUT_StartDate = '2019-01-01'; --user input
set @INPUT_EndDate = '2019-04-20'; --user input

select 
TBL.StartDate, 
TBL.EndDate, 
@INPUT_StartDate INPUT_StartDate, 
@INPUT_EndDate INPUT_EndDate,

datediff(day, case when tbl.StartDate < @INPUT_StartDate  then   TBL.STARTDate 
else   @INPUT_StartDate end, 
case when TBL.EndDate < @INPUT_EndDate  then @INPUT_EndDate
else  TBL.EndDate end) date_diff  

 from #temp tbl

Выход:

Startdate   Enddate     Input_startdate    input_enddate   date_diff
2019-03-20  2019-04-20  2019-01-01         2019-04-20      109
2018-02-01  2019-03-20  2019-01-01          2019-04-20     443
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...