0

这可能并不像它应该的那么复杂,但是 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 中提取时,为什么会收到 Not Valid Month 错误?我已经发现业务对象对类型非常严格,所以我想知道我是否在这里做错了什么。所有这些在 SQL 开发人员中都可以正常工作,但我不得不一遍又一遍地调整这个语句,以尝试在 Business Objects 使用它时让它工作。

4

1 回答 1

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

于 2010-07-22T20:41:26.907 回答