所以在查询级别,我有:
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中运行得非常好
2条答案
按热度按时间l3zydbqr1#
嗯,用varchar2或char将日期存储为字符串是一种非常糟糕的扩展实践。不管怎么说,我认为您的设置或构建查询的方式有问题:
此外,如您所说,如果您的数据存储为yyyymmddhhmiss,则对该字符应用了错误的日期掩码yyy-mm-dd hh24:mi:ss。我将使用cast将字段定义为date。
例子
更新
如果无法更改nls会话设置,则必须对结果输出应用to\ char。但是在您的例子中,您希望使用日期进行操作,因此只要它是您希望使用的日期值,就可以忽略掩码。
所以,如果你想把这个日期和另一个日期进行比较,不要使用
to_char
. 如果要以特定格式显示值,在没有更改设置的选项时,请使用to_char
.sshcrbum2#
只是为了确定什么
SYSDATE
(我要选择)代表:今天是:
这是获取错误的方法:对表示日期值的字符串应用错误的格式掩码:
如何修复?通常,如果将日期表示为字符串,则很难修复它。它们(代表日期的字符串)就像一盒巧克力,你永远不知道你会得到什么。如果至少有一个错误的值,查询将失败。
如何找到错误的值?如果传递给函数的字符串表示有效的日期格式,则可以创建一个返回true(或1或任何所需值)的函数。但是,如果你通过了
01/02/03
,哪个是哪个?不同的格式匹配(例如。dd/mm/yy
,yy/mm/dd
,mm/yy/dd
...). 更糟的情况是84/25/32
或者AB/23/2f
. 它们都是字符串,它们“匹配”由斜杠分隔的两个字符,但肯定不是有效的日期,因此不能依赖简单的正则表达式。很快,就没有简单快捷的办法了。