【问题标题】:IF ELSE return wrong value in SQL ServerIF ELSE 在 SQL Server 中返回错误值
【发布时间】:2021-08-31 00:04:58
【问题描述】:

我有一个脚本需要从 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)

从这个逻辑来看,应该是这样的值

  • begin_date = 2020 年 12 月 1 日上午 12:00
  • end_date = 2021 年 5 月 31 日上午 12:00

但它只返回值

  • begin_date = 2020 年 12 月 1 日上午 12:00

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

【问题讨论】:

  • 您正在设置 SET initial_date = NULL; 所以您的 initial_date 始终为空,因此您始终执行 if/else 的 if 部分。你永远不会进入 ELSE 部分
  • @nacho 嗯,抱歉,为什么我的@end_date 没有打印出来?我已经在我的@last_date if/else 条件下设置了它?
  • 此脚本引用了一些问题:'' 不是有效日期,也不是数字,要么分别使用 1970-01-010,要么将其删除。 DATEADD 看起来参数倒退了。最后一个ELSE 需要BEGIN/END。看起来你还没有听说过 EOMONTH()DATEFROMPARTS 函数

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


【解决方案1】:

如果我正确理解了您的问题,那么出现这种意外结果的原因是最后一行 (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    

【讨论】:

  • 所以我需要将BEGIN .. END 添加到我的另一个IF .. ELSE 条件中?比如@begin_date@last_date?
  • @RudyTriSaputra,并非总是如此。如果执行单个语句,BEGIN .. END 语言块(语句块)不是必需的,但不是错误。
  • 就我个人而言,我建议始终使用BEGIN/END,因为您可以避免这个问题,而且IMO 更容易保持一致,而不是根据IF 中是否有1 个语句或多个语句而使用不同的模式。
猜你喜欢
  • 2017-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
相关资源
最近更新 更多