所以在查询级别,我知道了
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时,我注意到我的日期是字符串格式的
元素名称=“ DATETIME”值=“ DATETIME”标签=“ DATETIME” dataType =“ xsd:string” breakOrder =“ ascending” fieldOrder =“ 3”
所以我删除了to_char以获取日期格式
我得到的错误是:
java.sql.SQLDataException:ORA-01843:无效月份
如何解决此问题?
编辑: 列TIMESTAMP的格式,格式为CHAR(14) 值的示例类似于20200701103038 它可以在SQL Developer中完美运行
答案 0 :(得分:2)
嗯,使用varchar2或char将DATES存储为字符串是一个很糟糕的扩展实践。无论如何,我认为您的设置或构建查询的方式存在问题:
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,则您将错误的日期掩码YYYY-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
。
答案 1 :(得分:1)
只需确保SYSDATE
(我要选择)代表什么:
SQL> alter session set nls_Date_format = 'dd.mm.yyyy';
Session altered.
今天是:
SQL> select sysdate from dual;
SYSDATE
----------
26.07.2020
这是获取错误的方法:对代表DATE值的字符串应用错误的格式掩码:
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
。它们都是字符串,它们“匹配” 两个用斜杠分隔的字符,但肯定不是有效的日期,因此您不能依赖简单的正则表达式。
简短地说,没有简单,快速的出路。