使用TO_DATE函数时ORA-01858

App*_*ppu 1 sql oracle date

select * 
from GM_STANDARD_UPLOAD_TEMP t
where  
    to_Date('24-DEC-2017') >  to_date(T.COL34) 
    and T.COL34 IS NOT NULL
    AND UPLOAD_BATCH_ID = 'UH00002319122018025335' 
    AND USER_AID = 'US000000' 
    and T.record_no > 1 
    and T.TRANS_TYPE='ADD';
Run Code Online (Sandbox Code Playgroud)

这里我的t.col34值来自table数据类型的表varchar2(20).我试图将其与值进行比较,但有时我遇到以下错误:

ORA-01858:找到了一个非数字字符,其中包含数字

GMB*_*GMB 6

你没有to_date正确使用.此Oracle函数需要第二个参数,该参数指定给定输入字符串的格式.

to_Date('24-DEC-2017') 
Run Code Online (Sandbox Code Playgroud)

应该写成:

to_Date('24-DEC-2017', 'dd-mmm-yyyy') 
Run Code Online (Sandbox Code Playgroud)

要么 :

to_Date('24-DEC-2017', 'dd-mon-yyyy', 'nls_date_language = american')
Run Code Online (Sandbox Code Playgroud)

列T34也是如此,你说的是VARCHAR2.您需要指定此列中存储的字符串日期.假设这与'24-DEC-2017'您的格式相同,您需要:

 to_Date('24-DEC-2017', 'dd-mmm-yyyy') >  to_date(T.COL34, 'dd-mmm-yyyy')
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅Oracle日期时间格式模型.

PS:请注意,在VARCHAR列中存储日期是一种不好的做法,应该避免(容易出错,效率不高,......).Oracle提供了针对该用例的DATE数据类型(以及各种其他相关的日期数据类型).