【问题标题】:SSRS and null datetimeSSRS 和空日期时间
【发布时间】:2013-08-19 14:33:15
【问题描述】:

我一直认为,当存储过程带回一个空日期时间时,SSRS 报告会在该单元格中显示 Mindate。问题是,根据我的经验,这并不总是正确的。我不知道为什么。有时报告会显示空白,有时会提示空日期时间。这是为什么?

是否有解释其工作原理的规则或文档(有意义)?当您使用的工具不一致时,很难保持一致。我可以制作两个设置完全相同的报告。一个将显示 mindate,一个将显示空日期时间为空白。没看懂。

编辑:

首先,是的,很多人都发生过头脑风暴的事情。 https://www.google.com/search?num=50&q=ssrs+null+date+show+blank&oq=ssrs+null+date+show+blank&gs_l=serp.3...8759.9774.0.9941.10.10.0.0.0.0.152.888.8j2.10.0....0...1c.1.25.serp..8.2.166.kl2WBVx4Ijw

几乎每个结果都有人在他们想要空白时谈论思维导图。许多结果来自 Stack Overflow,所以在你开始告诉我它永远不会发生之前,请意识到你完全错了。你可能从未见过它。在我多年的饮食和数千顿饭中,我从未在食物中看到过断指。并不意味着它没有发生在某人身上......

显示最小日期的示例:

在报告中,文本框的表达式为:

=Fields!SecondaryInjuryRecordDate.Value

在占位符属性窗口中,数字格式设置为 Date->01/31/2000。 很简单,没有什么奇怪的事情发生。对吗?

在 proc 中,该列的代码是:

CASE WHEN ISNULL(l.SecondaryInjury, 0) = 0 THEN '' ELSE l.SecondaryInjuryDXDate END AS SecondaryInjuryRecordDate

这导致只要 SecondaryInjuryDXDate 为空,就会显示 Mindate。我不得不切换到这个:

CASE WHEN ISNULL(l.SecondaryInjury, 0) = 0 THEN '' ELSE ISNULL(l.SecondaryInjuryDXDate, '') END AS SecondaryInjuryRecordDate

...当日期为空时得到空白。

SecondaryInjuryDXDate 是一个 DATETIME 并且 二次伤害有点。

【问题讨论】:

  • 根据我的经验,数据集中的 NULL 值将总是显示为空字符串,如果只是简单地放入文本框中。不过,找不到任何可以预测这种行为的官方消息来源。您是否有任何示例/复制品可以通过思维导图显示?我从未见过(当然,除非 数据集查询 会提供一个思维导图而不是一个 NULL 值)。
  • 我不知道如何在这里提供报告、存储过程、函数、数据库等的工作示例。
  • 这只是一个显示思维导图的示例情况。请参阅here for help on creating a minimal example 的某些东西(它针对代码,但也适用于报告之类的东西)。无论如何,如果无法重现您遇到的情况,我们很难对这个问题发表任何看法,我们只是猜测。
  • +1 @Jeroen。在数百份报告中,我从未在多个版本的 SSRS 中看到 null 值显示为最小日期。我强烈怀疑您的代码,无论是在查询中还是在报告中都是这样做的。
  • 你们可以继续投反对票,这不会让它不再发生。

标签: reporting-services


【解决方案1】:

在 SSRS 中,默认情况下,NULL DateTime 值将表示为空字符串。

如果对值应用数据格式,则将使用 MIN DateTime 值代替空值,例如:将 DateTime 转换为 ShortDate,如下所述:

在占位符属性窗口中,数字格式设置为 Date->01/31/2000。很简单,没有什么奇怪的事情发生。对吗?

为避免这种情况,列值必须包含在表达式中以有条件地应用所需的格式:

=IIf(IsNothing(Fields!DateTimeField.Value), "", FormatDateTime(Fields!DateTimeField.Value, DateFormat.ShortDate))

【讨论】:

    【解决方案2】:

    在文本框表达式中使用类似的东西:

    =IIf(IsNothing(Fields!DateTime.Value), "", Fields!DateTime.Value)
    

    【讨论】:

    • 我不认为你真的看过我问的内容。
    【解决方案3】:

    似乎没有关于此的文档。下一个最好的事情是让这个问答记录基于我们的集体经验。

    假设问题:“SSRS 在显示具有 NULL 值的 DATETIME 时会做什么?”...

    ...答案是它将显示一个空字符串。没有可重现的场景,即 NULL 值会显示为其他任何内容,除非您自己为此做一些工作,例如:

    • 如果查询将 NULL 合并为其他内容,例如字符串 "NULL" 或 MIN DATETIME;
    • 如果您有文本框值的表达式,例如IIF(Fields!MyDateTime.Value Is Nothing, "01-01-1900", Fields!MyDateTime.Value)

    【讨论】:

    • 我提供了一个示例,我可以一遍又一遍地重现,还提供了谷歌搜索结果,显示许多其他人在空日期时得到了提醒。
    【解决方案4】:

    在 SQL 查询中返回的每个字段都会分配一个数据类型。通常,您希望将返回的日期保留为 SQL 中的日期,而不是字符串。 (不要在 SQL 中将日期格式化为字符串。尽可能靠近表示层。)

    所以在你的查询中代替这个:

    CASE WHEN ISNULL(l.SecondaryInjury, 0) = 0 THEN '' ELSE l.SecondaryInjuryDXDate END AS SecondaryInjuryRecordDate
    

    我会尝试使用:

    CASE WHEN ISNULL(l.SecondaryInjury, 0) = 0 THEN CAST( NULL AS DateTime ) ELSE l.SecondaryInjuryDXDate END AS SecondaryInjuryRecordDate
    

    请参阅SQL cast datetime,了解为什么您在某个日期上的演员阵容为 0。

    【讨论】:

      【解决方案5】:

      我确实发现,当我格式化整个列时,例如 FormatDateTime(field, DateFormat.ShortDate) - SSRS 会将空白字段格式化为 01/01/0001。仅供参考。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多