这可能并不像应该的那样复杂,但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使用它时尝试使其工作。
答案 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
,它会继续工作。