cx_Oracle.DatabaseError: ORA-01843: 不是一个有效的月份

Posted

技术标签:

【中文标题】cx_Oracle.DatabaseError: ORA-01843: 不是一个有效的月份【英文标题】:cx_Oracle.DatabaseError: ORA-01843: not a valid month 【发布时间】:2020-04-01 07:48:00 【问题描述】:
select distinct sko.CONTENTId, 
       sko.HELPDESKID, 
       sko.SEGMENTID, 
       som.SUBMITTED_FOR_NAME, 
       sko.SUBMITTEDDATE, 
       to_date(sko.LASTMODIFIEDDATE, 'DD-MM-RR') 
 from sky_know_obj sko
 join sky_object_mass som 
   on sko.CONTENTId = som.CONTENTId 
where sko.LASTMODIFIEDDATE >  date'2019-11-03' 
  and sko.LASTMODIFIEDDATE <= date'2019-12-03'

这是我的 oracle sql 查询。我在 python 中运行它。当我在 Oracle SQL Developer 中运行它时,它会给出结果,但是每当我尝试在 pycharm 中执行它时,都会发生以下错误:

cx_Oracle.DatabaseError: ORA-01843: not a valid month

当我跑步时

select * from nls_session_parameters; 

这在 oracle sql developer 中然后显示

NLS_DATE_FORMAT  =  DD-MM-RR

【问题讨论】:

【参考方案1】:

当您将TO_DATE 应用于LASTMODIFIEDDATE 列并且它失败时,似乎并非所有值在该列中都有有效月份,这意味着它的数据类型不是date 而是varchar2

SQL Developer 不会返回所有行,而是返回前 50 行(左右)。如果您的查询扫描整个表或最初未显示的行,那么它将失败。尝试导航到 SQL Developer 中返回的记录集中的最后一行,看看会发生什么。

另一方面,如果列的数据类型是date,那么不要to_date它;这样做没有意义。

此外,您不应依赖数据库的设置。控制您的数据,当表示 date 时不要指定 string。使用日期文字,例如

where lastmodifieddate > date '2019-11-03' -- instead of '03-11-19'

【讨论】:

谢谢...现在可以使用了。不知道为什么我使用 to_date 作为 DATE 类型。我使用了 sko.LASTMODIFIEDDATE BETWEEN DATE '2020-01-01' AND DATE '2020-01-08' 这个..它现在可以工作了跨度>

以上是关于cx_Oracle.DatabaseError: ORA-01843: 不是一个有效的月份的主要内容,如果未能解决你的问题,请参考以下文章

python 3.6 cx_Oracle.DatabaseError: DPI-1050

(cx_Oracle.DatabaseError) DPI-1047: Cannot locate a 64-bit Oracle Client library:

python用cx_Oracle连接数据库,出现错误cx_Oracle.DatabaseError: DPI-1047: Cannot locate a 64-bit Oracle Client li

cx_Oracle.DatabaseError: ORA-28759: failure to open file

Linux下使用Python连接Oracle 报cx_Oracle.DatabaseError: DPI-1047: 64-bit Oracle Client library cannot be lo

已经配好64位的oracle instantclient,依旧Python报错cx_Oracle.DatabaseError: DPI-1047: Cannot locate a 64-bit Ora