【问题标题】:cx_Oracle.DatabaseError: ORA-01843: not a valid monthcx_Oracle.DatabaseError: ORA-01843: 不是一个有效的月份
【发布时间】: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

【问题讨论】:

    标签: sql oracle date-format


    【解决方案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' 这个..它现在可以工作了跨度>
    猜你喜欢
    • 1970-01-01
    • 2015-07-04
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-07
    • 2022-01-22
    • 2012-05-15
    相关资源
    最近更新 更多