2016-02-08 20 views
0

我知道有关于修复这个错误,但我只是不理解它的贴子大量!oracle sql - 一个非数字字符被发现在数字预计的地方

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为日期?

+2

你为什么要使用连字符在格式字符串,如果值包含句号? –

+0

使用to_date时会出现同样的错误(val_strg1,'DD.MM.YYYY') – SMORF

+0

对于'val_strg1',您有什么值? –

回答

0

如果您的字符串日期val_strg1的格式为'DD.MM.YYYY'(即'01 .04.2016'),那么您必须使用to_date(val_strg1,'DD.MM.YYYY');
例如:从dual中选择to_date('01 .04.2016','DD.MM.YYYY');
如果再次出现错误,可能是记录集中的字符串不是for_date函数的有效格式(请检查val_strg1列中的值)。
再见,
伊戈尔

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}$'); 

然后,您可以纠正错误的条目,但当然是一个更好的解决办法是不存储日期字符串列在所有。请使用日期列,以免发生此类问题。

+0

不幸的是,我无法改变列的类型。这确实是插入到文本列中的日期,但是,我无法访问该列(这是我们系统中非常具有历史意义的设置,无法更改)。是否有另一种使用文本作为日期的方式? – SMORF

+0

如果您无法更改表格设计,那么您可能至少会添加一个检查约束来确保日期格式。 –

0

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

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

...似乎工作确定。

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; 
相关问题