ORA-01843: 当 运行 作为 maximo 的报告时不是有效的月份异常
ORA-01843: not a valid month exception when running as report on maximo
我目前正在编写一些代码来查看我公司发出的服务票以及它们的路由位置。我正在使用 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" 块编写的)发布了截至昨天的月份列表,我需要那部分以便稍后分组。
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)。
我该如何解决?
编辑:
虽然 运行 此代码 "on Maximo"
SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT'
根据用户@MT0 的建议,我得到
DD-MON-RR
作为 return。考虑到这一点,有没有办法修改我的代码以使其按预期工作?
我会说,只需删除 TO_CHAR()
。如果生成日期,则应将其保留为 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);
我目前正在编写一些代码来查看我公司发出的服务票以及它们的路由位置。我正在使用 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" 块编写的)发布了截至昨天的月份列表,我需要那部分以便稍后分组。
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)。 我该如何解决?
编辑: 虽然 运行 此代码 "on Maximo"
SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT'
根据用户@MT0 的建议,我得到
DD-MON-RR
作为 return。考虑到这一点,有没有办法修改我的代码以使其按预期工作?
我会说,只需删除 TO_CHAR()
。如果生成日期,则应将其保留为 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);