oracle sql - 在预期数字的位置找到了非数字字符

时间:2016-02-08 13:09:51

标签: sql oracle to-date

我知道有很多关于修复此错误的帖子,但是,我只是不理解它!

val_strg1值为01.04.2016。我想使用此功能,而不是显示此日期早于当前日期的行(即and trunc(sysdate) < dv.val_strg1)。

但是,即使我使用了to_date格式,我仍然会收到a non-numeric character was found where a numeric was expected错误?

我尝试了几种to_date格式;

to_date(val_strg1,'DDMMYYYY')to_date(val_strg1,'DD-MM-YYYY')

以下内容给出了'not a valid month'错误?

to_date(val_strg1,'DD-MON-YYYY')

我的剧本......

select val_strg, val_strg1, to_date(val_strg1,'DDMMYYYY')
from sd_domainval_org 
where name = 'HYPERCARE_CUNR'
order by sort_no

如何将val_strg1用作日期?

4 个答案:

答案 0 :(得分:1)

您似乎正在使用文本列(例如VARCHAR2)作为日期。而且你在说那个

to_date(val_strg1, 'DD.MM.YYYY')

导致错误。因此,您在该列中的值与该模式不匹配。以下是查找此类无效条目的查询:

select * 
from domainval
where name = 'HYPERCARE_CUNR'
and not regexp_like(val_strg1, '^[[:digit:]]{2}\.[[:digit:]]{2}\.[[:digit:]]{4}$');

然后您可以更正错误的条目,但更好的解决方案当然不是将日期存储在字符串列中。请改用日期列,以免出现此类问题。

答案 1 :(得分:0)

如果您的字符串日期val_strg1的格式为&#39; DD.MM.YYYY&#39; (即&#39; 01.04.2016&#39;),然后你必须使用to_date(val_strg1,&#39; DD.MM.YYYY&#39;);
例如:从双重选择to_date(&#39; 01.04.2016&#39;,&#39; DD.MM.YYYY&#39;);
如果再次出现错误,可能是记录集中的字符串不是to_date函数的有效形式(检查val_strg1列中的值)。
再见,
伊戈尔

答案 2 :(得分:0)

我找到了答案......

and trunc(sysdate) < to_date(regexp_substr(val_strg1, '^[[:digit:]]{2}\.[[:digit:]]{2}\.[[:digit:]]{4}$'),'DD.MM.YYYY')

......似乎工作正常。

答案 3 :(得分:0)

您必须将格式化字符串调整为与日期结构完全匹配 在这种情况下

select val_strg, val_strg1, to_date(val_strg1,'DD.MM.YYYY')
from sd_domainval_org 
where name = 'HYPERCARE_CUNR'
order by sort_no;