使用函数TO_DATE时出现ORA-01858

时间:2018-12-19 10:48:30

标签: 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';

这里我的t.col34值来自表,列数据类型为varchar2(20)。 我试图将其与值进行比较,但一段时间后出现以下错误:

  

ORA-01858:发现一个非数字字符,其中数字为   预期的

1 个答案:

答案 0 :(得分:6)

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

to_Date('24-DEC-2017') 

应写为:

to_Date('24-DEC-2017', 'dd-mmm-yyyy') 

或:

to_Date('24-DEC-2017', 'dd-mon-yyyy', 'nls_date_language = american')

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

 to_Date('24-DEC-2017', 'dd-mmm-yyyy') >  to_date(T.COL34, 'dd-mmm-yyyy')

有关更多详细信息,请参见the Oracle Datetime Format Models

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