首页 > 解决方案 > IF ELSE 在 SQL Server 中返回错误值

问题描述

我有一个脚本需要从 IF ELSE 条件返回 DATETIME。但是我的返回值在这里得到了错误的值。

所以这是我的脚本

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)

从这个逻辑来看,它应该采用这样的值

但它只返回值

但是从那个脚本为什么它进入 ELSE 条件@initial_date?我的脚本有什么问题吗?

标签: sql-servertsqlsql-server-2008if-statement

解决方案


如果我正确理解了您的问题,则出现此意外结果的原因是最后一行 ( SET @end_date = DATEADD(MONTH, DATEDIFF(MONTH, 0, @begin_date) + @datediff, DATEPART(d, @initial_date));) 在IF.. ELSE块之外并且始终将值设置为@end_dateto NULL。最后一条语句中的适当BEIGN .. END块可能会解决此问题:IF..ELSE

...
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    

推荐阅读