0

我正在做一个简单的查询,它使用 DateDiff 函数来查找日期之间的天数。但是,对于某些情况,我想填充一个空白字段(不是空值)。

像这样的东西是我目前拥有的,它似乎工作正常(但它填充了一个空值)。

 [Test (Years)] = CASE WHEN TYPE IN ('A','B') 
 THEN NULL ELSE IsNull(CONVERT(decimal(28,12),
 (DATEDIFF(d,@StartDate,ExpirationDate)))/365,0) END

现在,如果我尝试这样的事情...尝试将所有类型 A 和 B 转换为填充空白,我将收到以下错误消息:Error converting data type varchar to numeric.

 [Test (Years)] = CASE WHEN TYPE IN ('A','B') 
 THEN '' ELSE IsNull(CONVERT(decimal(28,12),
 (DATEDIFF(d,@StartDate,ExpirationDate)))/365,0) END

我错过了一件简单的事情吗?我试过在不转换为小数的情况下进行计算,但它似乎不起作用。有任何想法吗?谢谢

4

1 回答 1

1

CASE是一个只返回一个值的表达式,并且所有分支都必须产生兼容的类型。字符串(甚至是空白字符串)与小数不兼容,因此您需要执行以下操作:

CASE WHEN ... THEN '' ELSE 
  CONVERT(VARCHAR(32), COALESCE(CONVERT(DECIMAL(23,12), ... ,0)) END

请注意,仅当您将数据呈现给最终用户时,此 hack 才会起作用。如果您尝试将此数据存储在列中或在其他计算中使用它,它也会被空白字符串绊倒。数字不能是空字符串:

DECLARE @i INT = '';
SELECT @i;

结果:

0

因此,如果您不希望“空”数字被解释为 0,请不要害怕,NULL如果您在演示时处理此问题,请让演示层显示一个空白字符串而不是NULL.

于 2013-09-26T16:24:52.150 回答