2016-02-08 61 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; 
相關問題