sql - ORA-01843 : not a valid month exception when running as report on maximo

标签 sql oracle date birt 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” 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/

相关文章:

php - 返回数值的 mySQL 计数查询?

mysql - 多个外键引用其他表中的单列

java - 使用 Java 从 oracle 获取行 id

sql - Oracle:获得团队的最大值(value)?

windows - 批处理文件中的前一天变量

javascript - 如何获取两个日期之间的日期数组?

mysql - 哪个数据库最适合 Magento

python - SQL 重新格式化/更改 TableView ,将重复内容作为列

java - 通过 Java 程序连接列和运行查询时使用别名

excel - 获取一天最后一个条目的值