所以,我在这里看到过一些类似的问题,但没有一个解决方案对我有效。在视图中,我通过执行以下操作生成datetype字段:
TO_DATE(DataOraModifica, 'YYYYMMDDhh24miss')
我正在查询这个视图,我想找到所有最近超过15天的条目。但是当我尝试这个的时候:
select dataoramodifica, sysdate-dataoramodifica as dife from myview
where sysdate-dataoramodifica<15
但是我得到这个错误:ora-01843:不是有效的月份01843。00000-“不是有效月份”
我在其他帖子上读到过,它可能与字符和日期转换以及会话时间格式有关。但我没有使用任何to\u字符,只是直接在原始字符串上使用一个to\u date
实际上,如果我尝试其他操作,例如:
select dataoramodifica, sysdate-dataoramodifica as dife from myview
where rownum<10
我得到了一个有意义的结果:
2016年8月13日1426.998530092592592593
唯一的问题是,当我尝试将此操作用于where条件时。我试着用tochar和todate把所有的东西都转换成相同的格式,然后再转换回来,但没有结果。我希望避免更改会话日期格式,因为在我看来,我使用了一些与日期相关的存储过程(不允许修改),而且这是一个工作系统,所以我不想造成麻烦。
谢谢您
----编辑----
我似乎并不是在处理所有使用时可能失败的情况:
length(F_Convert2NormalDate(dataoramodifica))=14 then
TO_DATE(F_Convert2NormalDate(DataOraModifica), 'YYYYMMDDhh24miss')
else TO_DATE('19000101000000', 'YYYYMMDDhh24miss') end
AS DATAORAMODIFICA
看看我有哪些可能的价值观:
select distinct
substr(f_convert2normaldate(dataoramodifica), 5,2) as mms, from mytable
我得到的值是:
(空)00 01 02 03 04 05 06 07 08 09 10 11 12
我想我需要找到一种方法来处理所有可能的转换错误,因为我显然遗漏了一些。这个 default
选项不起作用,因为我正在运行版本11。。。
----编辑---
正如你们大多数人所建议的,即使在我的14个字符的检查('19000000000000')之后,转换仍然失败。把这个加到我的´案子…那么´ 它起作用了。虽然它仍然感觉像是一个硬编码的解决方案,但我想现在必须这样做,因为我运行的版本不允许一般的异常处理(例如´违约。。。转换错误时´ ) 我认为这个问题必须在数据生成阶段由负责人来处理。
谢谢大家的帮助!
2条答案
按热度按时间2ul0zpep1#
存储过程。。。获取系统以某种方式编码生成的字符串,并以yyyymmddhhmmss的方式返回另一个字符串,如果输入未生成有效日期,则返回字符串“00”。
如果它实际返回'00000000000000'(或者,事实证明是'19000000000'),那么这些将导致错误:
当您查询不带条件的视图时,您可以使用
where rownum<10
如您所示,或者您的客户机只获取和显示“前”几行或行块(例如,在sqldeveloper中默认为50行)。这个过程(实际上是一个函数,大概是…)只为那几行调用,而这几行恰好不包含任何有问题的数据。当你有条件时,每一行都要被计算,所以你碰到了一个有问题的行。
您可以通过将视图更改为执行以下操作来避免此问题:
db<>小提琴
顺便说一句,我通常把条件写为
它需要做的工作更少,并且允许使用列上的索引;这在这里并不重要,因为视图列是一个函数调用。使用
trunc(sysdate)
将包括从该开始日期开始的所有数据,而不仅仅是从该日期的当前时间-不清楚您实际想要的是什么。看看你已经在做的长度检查,你可以把它合并为:
或者,如果您使用的是最新版本的oracle(12.2+),您可以
to_date()
处理任何错误条件:这可能会隐藏其他问题,你想抛出一个错误,所以你知道有一些东西你需要修复,但听起来不像是从你的描述。
db<>小提琴
要确定导致问题的值,可以执行以下操作:
它将尝试逐个转换表中的每个值;当它发现一个问题,它会报告它,但继续。当然,您可以在调试中添加其他有用的数据,比如行的主键值。
9avjhtql2#
我相信问题出在你的数据表上。假设有一个列具有字符串值,将该字符串转换为日期,然后在select and wheer子句中使用转换后的列。
以下是您可能遇到的情况的示例:
如果在表中是一个很好的字符串,如'202004052222222',那么您的查询将工作:
如果字符串类似于“202013052222222”,则您的查询将不起作用:
这里有一个小演示
您可以从我的示例中看到,我使用13作为数字字符串来表示月份,而这不是有效的月份。。。
下面是一个更好的示例,我创建了一个视图并使用了两个不同的查询:
https://dbfiddle.uk/?rdbms=oracle_18&fiddle=1f70f43aef1297044261ca813b8022bc