Reporting services 当错误部分包含表达式时,SSRS Iif始终为真

Reporting services 当错误部分包含表达式时,SSRS Iif始终为真,reporting-services,iif,Reporting Services,Iif,我有一个输出到Excel文件的报告,数据库中的一些字段是空的 我试图在单元格中使用以下Iif表达式过滤掉这些空值: =Iif( IsNothing(Fields!START_DATETIME.Value), 0, Fields!START_DATETIME.Value ) 这不起作用,我在数据为空的单元格中得到“#VALUE”,在有数据的单元格中得到时间值 如果我使用相同的表达式,但没有表达式作为第三个参数: =Iif( IsNothing(Fields!STA

我有一个输出到Excel文件的报告,数据库中的一些字段是空的

我试图在单元格中使用以下Iif表达式过滤掉这些空值:

=Iif(
    IsNothing(Fields!START_DATETIME.Value),
    0,
    Fields!START_DATETIME.Value
)
这不起作用,我在数据为空的单元格中得到“
#VALUE
”,在有数据的单元格中得到时间值

如果我使用相同的表达式,但没有表达式作为第三个参数:

=Iif(
    IsNothing(Fields!START_DATETIME.Value),
    0,
    1
)
我得到
1
s,其中表中有日期,而
0
s中没有日期

很抱歉,如果这是一个副本,我找不到任何适合我的

编辑: 我正在使用VisualStudio Professional 2013

更新

对于数据库中的每个条目,我得到的是:一个datetime表示授权时间,另一个表示开始时间,另一个表示停止时间。授权时间总是有一个条目,但启动和停止并不总是有条目

我将不同日期时间中的日期和超时拆分为如下列:

  • 授权日期
  • 授权时间
  • 开始时间
  • 停止时间
其想法是,如果没有启动和停止时间,只需使用授权的时间

以下表达式放在“开始时间”列中。抱歉,我没有足够的代表发布图像或超过2个链接。我已将程序输出放入此相册:

做:

=Iif(Fields!START_DATETIME.Value is Nothing,
    DateAdd(DateInterval.Day,693594,TimeValue(Fields!AUTH_DATETIME.Value)),
    DateAdd(DateInterval.Day,693594,TimeValue(Fields!AUTH_DATETIME.Value))
)
输出授权时间,以便正常工作

但是,要做到:

=Iif(Fields!START_DATETIME.Value is Nothing,
    DateAdd(DateInterval.Day,693594,TimeValue(Fields!AUTH_DATETIME.Value)),
    DateAdd(DateInterval.Day,693594,TimeValue(Fields!START_DATETIME.Value))
)
输出有条目的开始时间和#值!(空的或类似的)当没有任何东西的时候

并且做:

=Iif(Fields!START_DATETIME.Value is Nothing,
    DateAdd(DateInterval.Day,693594,TimeValue(Fields!START_DATETIME.Value)),
    DateAdd(DateInterval.Day,693594,TimeValue(Fields!AUTH_DATETIME.Value))
)
输出开始时间中有条目的授权时间和#值!当什么都没有的时候

我想不出来。我理解(1)和(3),但我需要的是(2)在有开始时间时显示正确的开始时间,在没有开始时间时显示授权时间

更新2

结果表明,即使未选择Iif()也会对每个条件进行求值,遇到的任何错误都会被传递。见对的评论

为了解决这个问题,我做了:

=DateAdd(
    DateInterval.Day,
    693594,
    TimeValue(
        Iif(
            Fields!START_DATETIME.Value is Nothing,
            Fields!AUTH_DATETIME.Value,
            Fields!START_DATETIME.Value
        )
    )
)
这似乎对我有用,而且应该是一开始做这件事的常识性方法

再次感谢大家的帮助。

Excel将根据前几个单元格猜测列的类型。如果其中有典型的
DATETIME
值,它会猜测该列是日期列,并且会在与类型不匹配的值(如“0”)上出现“
#VALUE!
”错误

您应该问问自己,对于空值,您希望在Excel中显示什么:

  • 如果您只需要一个空单元格,则完全不要使用表达式。只要
    字段!START\u DATETIME.Value
    将空值呈现为空单元格
  • 如果您想要一个“基线”日期时间,请确保使用它而不是“0”。最简单的方法可能是在您的查询中使用类似于
    ISNULL(START\u datetime,GETDATE())
  • 如果确实需要“0”,请确保它按顺序出现在前几个单元格之一。Excel将看到“0”,而不会将列类型设置为日期/时间

为什么要在包含日期时间的列中显示“0”?它代表什么?您不需要NULL、空字符串或一些默认日期时间吗?如果您想将它们作为“不显示”进行筛选“,你不能在你的查询中这样做吗?@Jeroen除了#VALUE之外,什么都可以!太好了,那只是尝试一下,我可能会把它留为空白。@Tino我可以尝试一下,但是我还没有接触到报表设计器之外的查询。我想知道为什么Iif不起作用。谢谢你们的意见。谢谢,效果很好。真不敢相信我居然没想到。我真是个笨蛋。。。对不起,我不能提高投票率,我的声望太低了。我不能让它只有一个空的手机。知道Excel是如何存储空白的吗<代码>#值Nothing(null)作为Iif()表达式的真实部分时,会将code>放在那里。@user111395当
START\u DATETIME
null
时,您不需要
Iif
,因为它已经是
null
,正如@Jeroen所说的那样,只需使用
=字段!START_DATETIME.Value
作为单元格值表达式+1@Jeroen,这是一个很好的解释。@ChrisLätta可以,但是Excel不知道如何从这个输出中格式化为日期或时间。我需要一段时间才能使用Excel中的筛选和排序选项。这几乎是一个新问题,但我尝试使用
DateAdd(DateInterval.Day,693594,TimeValue(Fields!START\u DATETIME.Value))
。如果不可能的话,我将不得不尝试研究其他一些选项,比如宏。再次感谢您的帮助。如果您希望在
start\u DATETIME
Null
时使用较低的常量开始日期,请按照@Jeroen在第二个要点中的建议,在表达式中设置一个实际日期(而不是0),如下所示:
=IIF(IsNothing(Fields!start\u DATETIME.Value),CDate(“1900-01-01”),Fields!start\u DATETIME.Value)