我在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
条款?
谢谢。
答案 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
。如果用户不必担心这一点,请将可见性设置为“隐藏”。