sql-server - 如何在选择查询中使用 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 附近有不少语法错误。
解决方案
您可以确保 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
推荐阅读
- python - Pandas 或 Numpy 中是否有从表中填充数据框的功能
- python - Tensorflow:加载大数据的现代方式
- asp.net - 在 ASP.Net Core 2.2 中定义不同的 API 以接受不同的大小限制
- c# - 如何链接对 Application.ThreadException 的调用?
- actionscript-3 - FlashDevelop 启动问题 - 插件问题
- typescript - 处理回调
定义 - android - 如何快速更改 Imageresource?
- c++ - 断言失败 CV_Assert( CV_IS_MAT(objectPoints) && CV_IS_MAT(imagePoints) && CV_IS_MAT(A) && CV_IS_MAT(rvec) && CV_IS_MAT(tvec) )
- r - 如何使用 R 中的条件计算日期之间的差异
- jquery - 使用wicket 7.10.0,如何更改jquery 3.2.1的打包版本