Oracle SQL - DATE大于语句

use*_*826 46 sql oracle format date

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

SELECT * FROM OrderArchive
WHERE OrderDate <= '31 Dec 2014';
Run Code Online (Sandbox Code Playgroud)

我尝试了以下但是它返回一个错误,说我的日期格式错误.但是,插入我使用该日期格式的数据按要求/预期并且没有问题.

命令行出错:10列:25

大段引用

错误报告 -

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

*原因:输入中的文字必须与格式字符串中的文字长度相同(前导空格除外).如果已打开"FX"修饰符,则文字必须完全匹配,没有额外的空格.

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

Syl*_*oux 57

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

SELECT * FROM OrderArchive
WHERE OrderDate <= DATE '2015-12-31'
Run Code Online (Sandbox Code Playgroud)

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

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

  • @NicholasHumphrey Convert与日期时间转换无关,而是用于字符集之间的转换(Latin-1到ASCII等)。 (2认同)

Sac*_*chu 28

您需要使用该to_date()函数将字符串转换为日期

SELECT * FROM OrderArchive
WHERE OrderDate <= to_date('31-Dec-2014','DD-MON-YYYY');
Run Code Online (Sandbox Code Playgroud)

要么

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

要么

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

这仅在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');
Run Code Online (Sandbox Code Playgroud)


kam*_*aze 1

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