我的表中有一个开始日期和结束日期列,我得到一个开始日期和结束日期作为输入。如果输入日期晚于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附近有很多语法错误。
答案 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