如何修复ora-01843:不是有效月份?

shstlldc  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(359)

所以在查询级别,我有:

to_char(
    (
        to_date(
        substr(TIMESTAMP, 1, 19),
        'yyyy-mm-dd hh24:mi:ss'
        )
    ),
    'dd-mon-yyyy hh24:mi:ss'
    ) as DateTime,

我试着看了几篇文章,其中最引人注目的是:
如何更改oracle bi publisher中的日期格式?
我也尝试过使用:

and trunc(TIMESTAMP) between :FROM_DATE AND :TO_DATE
--and also
and trunc(TIMESTAMP) between to_date(:FROM_DATE, 'yyyy-MM-dd') AND to_date(:TO_DATE, 'yyyy-MM-dd')

在浏览结构和xml时,我注意到我的日期是字符串格式的:
element name=“datetime”value=“datetime”label=“datetime”数据类型=“xsd:string“breakorder=”升序“fieldorder=”3”
所以我删除了tou字符来获取日期格式
我得到的错误是:
java.sql.sqldataexception:ora-01843:不是有效月份
如何解决此问题?
edit:列的格式,timestamp,格式是char(14)值的示例类似于20200701103038它在sqldeveloper中运行得非常好

l3zydbqr

l3zydbqr1#

嗯,用varchar2或char将日期存储为字符串是一种非常糟糕的扩展实践。不管怎么说,我认为您的设置或构建查询的方式有问题:

SQL> alter session set nls_date_format='YYYYMMDDHH24MISS' ;

Session altered.

SQL> select to_date('20200726123722') from dual ;

TO_DATE('20200
--------------
20200726123722

SQL> select sysdate from dual ;

SYSDATE
--------------
20200726124622

此外,如您所说,如果您的数据存储为yyyymmddhhmiss,则对该字符应用了错误的日期掩码yyy-mm-dd hh24:mi:ss。我将使用cast将字段定义为date。
例子

SQL> create table my_test ( c1 char(20) ) ;

Table created.

SQL> insert into my_test values ('20200726123722') ;

1 row created.

SQL>  insert into my_test values ('20200725123722') ;

1 row created.

SQL> commit ;

Commit complete.

SQL>  alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

Session altered.

SQL> select cast(c1 as date) from my_test ;

CAST(C1ASDATE)
-------------------
2020-07-26 12:37:22
2020-07-25 12:37:22

SQL>

更新
如果无法更改nls会话设置,则必须对结果输出应用to\ char。但是在您的例子中,您希望使用日期进行操作,因此只要它是您希望使用的日期值,就可以忽略掩码。

SQL> col value for a20
SQL> select value from nls_database_parameters where parameter = 'NLS_DATE_FORMAT' ;

VALUE
--------------------
DD-MON-RR

SQL> select cast(to_date('20200725123722','YYYYMMDDHH24MISS') as date) from dual ;

CAST(TO_D
---------
25-JUL-20

SQL> select to_char( cast(to_date('20200725123722','YYYYMMDDHH24MISS') as date) , 'YYYYMMDDHHMISS' ) from dual ;

TO_CHAR(CAST(T
--------------
20200725123722

SQL> select case when cast(to_date('20200725123722','YYYYMMDDHH24MISS') as date)  > sysdate
  2  then 'FALSE'
  3  else
  4  'TRUE'
  5  end as result from dual ;

RESUL
-----
TRUE

SQL>

所以,如果你想把这个日期和另一个日期进行比较,不要使用 to_char . 如果要以特定格式显示值,在没有更改设置的选项时,请使用 to_char .

sshcrbum

sshcrbum2#

只是为了确定什么 SYSDATE (我要选择)代表:

SQL> alter session set nls_Date_format = 'dd.mm.yyyy';

Session altered.

今天是:

SQL> select sysdate from dual;

SYSDATE
----------
26.07.2020

这是获取错误的方法:对表示日期值的字符串应用错误的格式掩码:

SQL> select to_Date('2020-27-07', 'yyyy-mm-dd') from dual;
select to_Date('2020-27-07', 'yyyy-mm-dd') from dual
               *
ERROR at line 1:
ORA-01843: not a valid month

SQL>

如何修复?通常,如果将日期表示为字符串,则很难修复它。它们(代表日期的字符串)就像一盒巧克力,你永远不知道你会得到什么。如果至少有一个错误的值,查询将失败。
如何找到错误的值?如果传递给函数的字符串表示有效的日期格式,则可以创建一个返回true(或1或任何所需值)的函数。但是,如果你通过了 01/02/03 ,哪个是哪个?不同的格式匹配(例如。 dd/mm/yy , yy/mm/dd , mm/yy/dd ...). 更糟的情况是 84/25/32 或者 AB/23/2f . 它们都是字符串,它们“匹配”由斜杠分隔的两个字符,但肯定不是有效的日期,因此不能依赖简单的正则表达式。
很快,就没有简单快捷的办法了。

相关问题