如何在我的 where 子句中使用表达式 return 查询的动态日期范围

How can I use an expression in my where clause to return a dynamic date range for my query

我正在 BIDS 2008r2 中处理从 Oracle 数据库中提取数据的 SSRS 报告。

我有一个使用硬日期范围的 where 子句,我想将其更改为一个会随着时间的推移而动态变化的表达式。

这是当前适用于 return 上个月的第一天到上个月的最后一天的 where 子句。即我正在寻找上个月的所有数据

WHERE  CHRGDTTM BETWEEN {ts '2015-12-01 00:00:00'} AND {ts '2015-12-31 23:59:00'}

我写了一个 return 上个月月初的表达式:

DateAdd(DateInterval.Month, -1, DateSerial(Year(Date.Now), Month(Date.Now), 1))

还有一个 return 是上个月的月底:

DateAdd(DateInterval.Minute, -1, DateSerial(Year(Date.Now), Month(Date.Now), 1))

如何将它们放入我的 where 子句中?

谢谢。

如果您想完全在 Oracle where 子句中执行此操作,您可以执行以下操作:

WHERE CHRGDTTM >= ADD_MONTHS(TRUNC(sysdate, 'MM'), -1)
AND CHRGDTTM < TRUNC(sysdate, 'MM')

TRUNC(date) function 截断提供的日期 - 在本例中为系统日期;默认情况下,它会删除时间部分,因此会在今天早上给您午夜,但这会使用 MM 格式模型修改该行为,并在当月的第一天给您午夜。所以今天 TRUNC(SYSDATE, 'MM') 给你 2016-01-26 00:00:00。您可以将其用于日期范围的上限。

这个ADD_MONTHS() function,嗯,加了个数,这里的-1给你2015-12-0100:00:00代替。放在一起可以得到从 2015-12-01 00:00:00 到但不包括 2016-01-01 00:00:00 的所有内容,这相当于你的 BETWEEN 范围。

您还可以使用间隔计算来获取上个月的开始时间:

WHERE CHRGDTTM >= TRUNC(sysdate, 'MM') - INTERVAL '1' MONTH
AND CHRGDTTM < TRUNC(sysdate, 'MM')

这具有相同的效果,并且是安全的,因为您总是会从计算中得到一个有效日期;月末的日期可能更容易出问题。

您可以阅读有关 datetime/interval arithmetic in the documentation 的更多信息。

作为替代方法,您可以创建两个 Date/Time 类型的参数,并使用您开发的表达式为参数设置默认值。然后在查询中它就变成了 WHERE CHRGDTTM BETWEEN :StartDate AND :EndDate。如果用户不需要担心这一点,请将两者的可见性设置为隐藏。