PL / SQL问题:通过业务对象报告选择时不是有效月错误

时间:2010-07-22 20:15:42

标签: oracle plsql business-objects date-arithmetic

这可能并不像应该的那样复杂,但Business Objects似乎对SQL Developer的使用方式非常非常严格。以下是有关陈述的部分:

ship_date between '01' || '-' || w_current_ora_month || '-' || to_char(to_date(w_last_day, 'DD-MON-RR HH:MI:SS AM'), 'yy') and to_char(to_date(w_last_day, 'DD-MON-RR HH:MI:SS AM'))

w_current_ora_month VARCHAR2(3)通过以下方式填写:

SELECT to_char(sysdate,   'MON')
  INTO w_current_ora_month
  FROM dual;

w.last_day DATE通过以下方式填写:

SELECT trunc(LAST_DAY('01' || '-' || w_current_ora_month || '-' || to_char(w_year)))
    into w_last_day
    from dual

为什么从Business Objects中提取时会出现无效月错误?我已经发现Business对象在类型上是严格的,所以我想知道我在这里做错了什么。所有这些在SQL开发人员中都可以正常工作,但我不得不反复调整此语句,以便在Business Objects使用它时尝试使其工作。

1 个答案:

答案 0 :(得分:6)

你依赖于从字符串到日期的隐式转换,这总是一个坏主意。

如果您必须转换为字符串然后返回日期,请始终使用to_date和日期掩码。否则,你依赖于NLS变量,这些变量可以在会话中更改(几乎可以肯定是你的问题的原因)。

然而,在这种情况下,你不必。您的病情可以简化为:

ship_date between trunc(sysdate,'MON') and last_day(trunc(sysdate))

正如@APC所指出的,如果你的字段包含一个时间组件,你将希望在一个月的最后一天结束时获取所有内容。这可以通过以下几种方式实现:

ship_date between trunc(sysdate,'MON') 
              and last_day(trunc(sysdate))+(86399/86400)

ship_date between trunc(sysdate,'MON') 
              and add_months(trunc(sysdate,'MON'),1)-(1/86400)

ship_date >= trunc(sysdate,'MON') 
    and ship_date < add_months(trunc(sysdate,'MON'),1)

我倾向于选择最后一个版本,因为如果你决定将字段更改为TIMESTAMP,它会继续工作。