0

我们在 SAP Netweaver 中部署了一个 Java Web 应用程序,它通过普通 JDBC 访问 Oracle 10g 数据库。该应用程序运行良好,直到几天前,查询导致以下错误:

ORA-01843: not a valid month

给我们带来麻烦的查询是这样的:

SELECT *
FROM   (SELECT *
        FROM   (SELECT inspeccion.sociedad_id,
                       inspeccion_id,
                       estado_id,
                       (SELECT des_estado
                        FROM   estado
                        WHERE  estado.estado_id = inspeccion.estado_id)
                       des_estado,
                       (SELECT numero_secuencia
                        FROM   estado
                        WHERE  estado.estado_id = inspeccion.estado_id)
                       numero_secuencia,
                       planta_id,
                       (SELECT des_planta
                        FROM   planta
                        WHERE  planta.planta_id = inspeccion.planta_id)
                       des_planta,
                       area_id,
                       (SELECT des_area
                        FROM   area
                        WHERE  area.area_id = inspeccion.area_id)       des_area
                       ,
                       igp_id,
                       '-'
                       nom_lider,
                       nom_inspector,
                       nom_responsable,
                       To_char(fecha_inspeccion, 'DD/MM/YYYY')
                       fecha_inspeccion,
                       observacion,
                       recomendacion
                FROM   inspeccion) inspeccion) t_inspeccion
WHERE  estado_id NOT IN ( 10 )
       AND t_inspeccion.estado_id IN ( 11, 12 )
       AND t_inspeccion.planta_id = 42
       AND t_inspeccion.fecha_inspeccion >= To_date('01/11/2010', 'dd/mm/yyyy')
       AND t_inspeccion.sociedad_id = '0101'
ORDER  BY t_inspeccion.numero_secuencia,
          t_inspeccion.fecha_inspeccion

我们怀疑该To_date('01/11/2010', 'dd/mm/yyyy')语句,但是当我们通过 DBVisualizer 运行查询时,我们一点问题都没有。

我有点迷失在这里。也许有一个数据库设置与查询混淆,或者一些 SAP Netweaver 配置?或者可能是一些 Oracle 驱动程序问题?

4

1 回答 1

5

在成为t_inspeccion您的嵌套选择中:

To_char(fecha_inspeccion, 'DD/MM/YYYY') fecha_inspeccion,

...然后在外部where子句中你有:

AND t_inspeccion.fecha_inspeccion >= To_date('01/11/2010', 'dd/mm/yyyy')

假设原件inspection.fecha_inspeccion是 a date,您似乎正在转换为字符串,然后进行隐式转换回日期以将其与您的固定值进行比较。我怀疑隐式转换t_inspeccion.fecha_inspeccion会引发错误,可能来自意外NLS_DATE_FORMAT设置;在 Java 中,它通常是从您的语言环境中获得的。从错误中我猜它隐含地使用了 MM/DD/YYYY,但很容易是别的东西。

我不明白为什么你有这个to_char(),除非你特别想要结果中的文本格式;在这种情况下,您需要在where子句中显式转换日期:

AND To_date(t_inspeccion.fecha_inspeccion, 'dd/mm/yyyy')
    >= To_date('01/11/2010', 'dd/mm/yyyy')

...或者也拉出原始日期列并使用它进行比较;尽管这可能需要您在最外层列出所有其他列select。如果您正在或期望使用索引,fecha_inspeccion那么您也可能通过将其视为字符串来降低性能。

于 2012-05-03T16:51:37.550 回答