我目前正在编写一些代码,以查看我公司发出的服务票证及其路由位置。我正在使用 Birt for Eclipse 创建一个使用该代码的报告。使用 Toad 12.0.10.30 时,不会引发异常,Birt 也是如此。将报告上传到 Maximo (IBM) 并在那里运行报告时,我收到一份失败的报告,日志文件指出
[ERROR] [MXQServer1] [] DataSet [Data_Set_Name] fetch failed:
java.sql.SQLDataException: ORA-01843: not a valid month
我尝试修复日期值的正则表达式并检查一切是否正常并且实际上是日期。
这些是我的代码中使用日期的部分:
and trunc(creationdate) between to_date('01.01.2019', 'dd.MM.RRRR') and TRUNC(sysdate-1)
这部分代码(代码是用“with” block 编写的)发布了截至昨天的月份列表,我稍后需要该部分进行分组。
SELECT TO_CHAR ( ADD_MONTHS ( start_dt, LEVEL - 1), 'DD/MM/YYYY') AS monate
FROM (
SELECT TRUNC ( TO_DATE ( '01/01/2019', 'DD/MM/YYYY')) AS start_dt,
TRUNC ( sysdate-1) AS end_dt FROM dual
)
CONNECT BY LEVEL <= 1 + MONTHS_BETWEEN ( end_dt , start_dt)
这就是通过 Maximo 发布的报告创建系统日期的方式:
2019-09-19 07:47:59.0
是否是在运行报告时,月份解析错误?因为 sysdate 的构建方式与我的 Formation 不同(YYYY-MM-DD 到 DD/MM/YYYY)。 我该如何解决这个问题?
编辑: 在“Maximo 上”运行此代码时
SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT'
根据用户@MT0的建议,我得到
DD-MON-RR
作为返回。考虑到这一点,有没有办法修改我的代码以使其按预期工作?
最佳答案
我想说,只需删除TO_CHAR()
即可。如果生成 DATE,则应将其保留为 DATE
值。
SELECT ADD_MONTHS(DATE '2019-01-01', LEVEL - 1) AS monate
FROM dual
CONNECT BY LEVEL <= 1 + MONTHS_BETWEEN(TRUNC(SYSDATE-1), DATE '2019-01-01');
或
WITH dt AS
(SELECT DATE '2019-01-01' AS start_dt FROM dual)
SELECT ADD_MONTHS(start_dt, LEVEL - 1) AS monate
FROM dt
CONNECT BY LEVEL <= 1 + MONTHS_BETWEEN(TRUNC(SYSDATE-1), start_dt);
关于sql - ORA-01843 : not a valid month exception when running as report on maximo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58004579/