首页 > 解决方案 > 如何在选择查询中使用 if 条件?

问题描述

我的表中有一个开始日期和结束日期列,我得到一个开始日期和结束日期作为输入。如果开始日期在输入开始日期之后,我需要将开始日期设置为 TBL.StartDate,如果在输入结束日期之前,我需要将结束日期设置为 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 附近有不少语法错误。

标签: sql-serverif-statementselect

解决方案


您可以确保 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

推荐阅读