如何在选择查询中使用if条件?

时间:2019-04-21 19:07:18

标签: sql-server if-statement select

我的表中有一个开始日期和结束日期列,我得到一个开始日期和结束日期作为输入。如果输入日期晚于INPUT开始日期,则需要将开始日期设置为TBL.StartDate;如果输入日期晚于INPUT结束日期,则需要将结束日期设置为TBL.EndDate。最后计算一下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

我期望发生这种比较,但是我想我正在选择查询之间使用if语句吗?

实际结果是if附近有很多语法错误。

3 个答案:

答案 0 :(得分:0)

您可以确保case语句与if相同,但用于case语句。如果要在选择列表中使用if(如果SQL Server为2012+,则为IIF)。 If主要用于条件逻辑中。

我删除了@start和@end日期变量,根据您使用的逻辑,这些变量可能不是必需的。

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

答案 1 :(得分:0)

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);

答案 2 :(得分:0)

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