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

时间:2016-01-26 23:09:10

标签: oracle ssrs-2008-r2 bids

我在BIDS 2008r2上使用SSRS报告从Oracle数据库中提取数据。

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

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

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

我写了一个表达式,它返回上个月的开头:

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

和一个返回上个月末的人:

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

如何将这些内容纳入我的where条款?

谢谢。

2 个答案:

答案 0 :(得分:0)

如果您想在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-01 00: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的更多信息。

答案 1 :(得分:0)

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