Oracle SQL - DATE大于语句

时间:2015-05-31 09:18:34

标签: sql oracle date format

正如标题所说,我想找到一种方法,通过查询检查我的哪些数据集是从SYSDATE过去6个月。

SELECT * FROM OrderArchive
WHERE OrderDate <= '31 Dec 2014';

我尝试过以下操作,但它返回错误,说我的日期格式错误。但是,按照请求/预期插入我使用该日期格式的数据并且没有问题。

  

命令行出错:10列:25

     

块引用

     

错误报告 -

     

SQL错误:ORA-01861:literal与格式字符串不匹配   01861. 00000 - “文字与格式字符串不匹配”

     

*原因:输入中的文字必须与文字中的文字长度相同              格式字符串(前导空格除外)。如果              “FX”修饰符已经打开,文字必须完全匹配,              没有多余的空白。

     

*操作:更正格式字符串以匹配文字。

3 个答案:

答案 0 :(得分:44)

由于您的查询字符串是文字,并且假设您的日期已正确存储为DATE,您应该使用date literals

SELECT * FROM OrderArchive
WHERE OrderDate <= DATE '2015-12-31'

如果您想使用TO_DATE(例如,因为您的查询值不是文字),我建议您明确设置NLS_DATE_LANGUAGE参数,因为您使用的是美国缩写的月份名称。这样,它就不会破坏某些本地化的Oracle安装:

SELECT * FROM OrderArchive
WHERE OrderDate <= to_date('31 Dec 2014', 'DD MON YYYY',
                           'NLS_DATE_LANGUAGE = American');

答案 1 :(得分:26)

您需要使用to_date()函数

将字符串转换为日期
SELECT * FROM OrderArchive
WHERE OrderDate <= to_date('31-Dec-2014','DD-MON-YYYY');

OR

SELECT * FROM OrderArchive
WHERE OrderDate <= to_date('31 Dec 2014','DD MON YYYY');

OR

SELECT * FROM OrderArchive
WHERE OrderDate <= to_date('2014-12-31','yyyy-MM-dd');

仅当OrderDate存储在Date format时,此功能才有效。如果是Varchar,您应该在该列上应用to_date() func,例如

 SELECT * FROM OrderArchive
    WHERE to_date(OrderDate,'yyyy-Mm-dd') <= to_date('2014-12-31','yyyy-MM-dd');

答案 2 :(得分:1)

你必须使用To_Date()函数将字符串转换为日期! http://www.techonthenet.com/oracle/functions/to_date.php