【问题标题】:How to exclude the February 29 - Leap Year in a Date column using Cognos 10 Report Studio?如何使用 Cognos 10 Report Studio 在日期列中排除 2 月 29 日 - 闰年?
【发布时间】:2025-11-29 06:55:01
【问题描述】:

如何在 Cognos 10 Report Studio 的日期列中排除 2 月 29 日 - 闰年?

这是我用于日期提示的列

下面是我在日期列上应用的提示

下面描述的是日期提示的详细信息和属性,我将使用日期提示过滤我的报告。

因此,报告中的所有属性和度量都使用我在报告中使用的到期日期列的开始日期和结束日期进行过滤。 如何避免 2 月 29 日在我的计算列(度量)中加起来?我想得到从 1 月 1 日到 12 月 31 日的所有计算,而不是每四年发生一次的 2 月 29 日? 2 月 29 日的数据可能包含也可能不包含大量数据,但它在年终计算时会产生连锁反应。这就是为什么我要排除计算中包含的 2 月 29 日。

【问题讨论】:

  • 为什么要排除 2 月 29 日?当天的交易情况如何?我相信你可以想出一些类似and month(<date column>) <> 2 and day(<date column>) <> 29 的逻辑。但我仍然对你为什么要排除它感到困惑。
  • 根据业务分析师的说法,用户希望排除 2 月 29 日的数据。我不能使用(日期列表达式) 29,因为该列使用的是 2015 年 2 月 29 日日期格式,因为它在我的第一个屏幕截图中使用 CAST 进行了调整。

标签: cognos cognos-10 cognos-bi


【解决方案1】:

这是一个将排除“闰日”的过滤器表达式:

not (extract(month,[Policy Expiration Date]) = 2 and extract(day,[Policy Expiration Date]) = 29)

【讨论】:

  • 谢谢。这是否假设是 Not in function?那我就直接把filter部分的[Policy Expiration Date]拖进去修改成这个吧?
  • 没有。在这种情况下,非运算符否定括号内布尔运算的结果。如果您只是将括号的内容作为过滤器,那么它只会返回 2 月 29 日。not 会翻转逻辑,返回除 2 月 29 日之外的所有内容。
  • 我刚刚发现我正在修改的报告正在使用 (12 * _days_between([Policy Expiration Date],[Policy Effective Date]))/365 有什么方法可以将您的答案应用于此?提前谢谢你
  • 那么,如果 2/29 发生在 [Policy Effective Date] 和 [Policy Expiration Date] 之间,您是否要问如何从计算中删除 2/29?如果是这样,我建议执行两种计算,一种用于闰年,另一种用于非闰年。对于 2/29 出现在范围内的计算,只需从 _days_between() 函数的结果中减去 1。我们正在处理什么样的时间尺度?年?几个月?
  • 进一步考虑,我的答案中的过滤器应该从结果集中删除所有 2/29 记录,因此你的计算也是如此。
【解决方案2】:

请试试这个。

([Policy Expiration Date] 介于 ?Expiration Start Date? 和 ?Expiration End Date? 之间)

to_char([Policy Expiration Date],'mmdd') '0229'

【讨论】:

  • 谢谢。所以我只需在提示中添加 AND to_char([Policy Expiration Date],'mmdd') '0229'?
  • 这仅适用于支持 to_char 函数的 DB2 和其他数据源。这不是标准的 Cognos 函数。
  • @BongReyes 是的,只需将其添加到过滤器中即可。顺便说一句,Johnsonium 是正确的。我不确定您使用的是什么数据库,但不妨试一试?如果没有,请告诉我,这样我可以给你另一个解决方法