IF ELSE return SQL 服务器中的错误值
IF ELSE return wrong value in SQL Server
我有一个脚本需要 return 来自 IF ELSE 条件的 DATETIME。但是我的 return 值在这里得到了错误的值。
所以这是我的脚本
DECLARE @last_date SMALLDATETIME;
DECLARE @end_date SMALLDATETIME;
DECLARE @initial_date SMALLDATETIME;
DECLARE @begin_date SMALLDATETIME;
DECLARE @datediff int;
DECLARE @date_day int;
SET @last_date = NULL;
SET @datediff = NULL;
SET @initial_date = NULL;
IF (@datediff = '' or @datediff is NULL)
SET @datediff = 5;
ELSE
SET @datediff = @datediff;
IF (@last_date = '' or @last_date is NULL)
SET @end_date = DATEADD(MONTH, DATEDIFF(MONTH, -1, GETDATE())-1, -1);
ELSE
SET @end_date = DATEADD(MONTH, DATEDIFF(MONTH, -1, @last_date)-1, -1);
IF (@initial_date = '' or @initial_date is NULL)
SET @begin_date = DATEADD(MONTH, DATEDIFF(MONTH, 0, @end_date)-@datediff, 0);
ELSE
SET @begin_date = @initial_date;
SET @end_date = DATEADD(MONTH, DATEDIFF(MONTH, 0, @begin_date)+@datediff, DATEPART(d,@initial_date));
print(@begin_date)
print(@end_date)
按照这个逻辑,应该取这样的值
- begin_date = 2020 年 12 月 1 日 12:00AM
- end_date = 2021 年 5 月 31 日 12:00AM
但它只有 return 值
- begin_date = 2020 年 12 月 1 日 12:00AM
但是从那个脚本为什么它进入了 ELSE 条件 @initial_date
?我的脚本有什么问题吗?
如果我对您的问题的理解正确,出现这种意外结果的原因是最后一行 (SET @end_date = DATEADD(MONTH, DATEDIFF(MONTH, 0, @begin_date) + @datediff, DATEPART(d, @initial_date));
) 在 IF.. ELSE
块之外,并且始终设置 @end_date
的值至 NULL
。在最后一个 IF..ELSE
语句中适当的 BEIGN .. END
块可能会解决这个问题:
...
IF (@initial_date = '' or @initial_date is NULL)
SET @begin_date = DATEADD(MONTH, DATEDIFF(MONTH, 0, @end_date)-@datediff, 0);
ELSE BEGIN
SET @begin_date = @initial_date;
SET @end_date = DATEADD(MONTH, DATEDIFF(MONTH, 0, @begin_date)+@datediff, DATEPART(d,@initial_date));
END
我有一个脚本需要 return 来自 IF ELSE 条件的 DATETIME。但是我的 return 值在这里得到了错误的值。
所以这是我的脚本
DECLARE @last_date SMALLDATETIME;
DECLARE @end_date SMALLDATETIME;
DECLARE @initial_date SMALLDATETIME;
DECLARE @begin_date SMALLDATETIME;
DECLARE @datediff int;
DECLARE @date_day int;
SET @last_date = NULL;
SET @datediff = NULL;
SET @initial_date = NULL;
IF (@datediff = '' or @datediff is NULL)
SET @datediff = 5;
ELSE
SET @datediff = @datediff;
IF (@last_date = '' or @last_date is NULL)
SET @end_date = DATEADD(MONTH, DATEDIFF(MONTH, -1, GETDATE())-1, -1);
ELSE
SET @end_date = DATEADD(MONTH, DATEDIFF(MONTH, -1, @last_date)-1, -1);
IF (@initial_date = '' or @initial_date is NULL)
SET @begin_date = DATEADD(MONTH, DATEDIFF(MONTH, 0, @end_date)-@datediff, 0);
ELSE
SET @begin_date = @initial_date;
SET @end_date = DATEADD(MONTH, DATEDIFF(MONTH, 0, @begin_date)+@datediff, DATEPART(d,@initial_date));
print(@begin_date)
print(@end_date)
按照这个逻辑,应该取这样的值
- begin_date = 2020 年 12 月 1 日 12:00AM
- end_date = 2021 年 5 月 31 日 12:00AM
但它只有 return 值
- begin_date = 2020 年 12 月 1 日 12:00AM
但是从那个脚本为什么它进入了 ELSE 条件 @initial_date
?我的脚本有什么问题吗?
如果我对您的问题的理解正确,出现这种意外结果的原因是最后一行 (SET @end_date = DATEADD(MONTH, DATEDIFF(MONTH, 0, @begin_date) + @datediff, DATEPART(d, @initial_date));
) 在 IF.. ELSE
块之外,并且始终设置 @end_date
的值至 NULL
。在最后一个 IF..ELSE
语句中适当的 BEIGN .. END
块可能会解决这个问题:
...
IF (@initial_date = '' or @initial_date is NULL)
SET @begin_date = DATEADD(MONTH, DATEDIFF(MONTH, 0, @end_date)-@datediff, 0);
ELSE BEGIN
SET @begin_date = @initial_date;
SET @end_date = DATEADD(MONTH, DATEDIFF(MONTH, 0, @begin_date)+@datediff, DATEPART(d,@initial_date));
END