正如标题所说,我想找到一种方法,通过查询检查我的哪些数据集是从SYSDATE过去6个月。
SELECT * FROM OrderArchive
WHERE OrderDate <= '31 Dec 2014';
我尝试过以下操作,但它返回错误,说我的日期格式错误。但是,按照请求/预期插入我使用该日期格式的数据并且没有问题。
命令行出错:10列:25
块引用
错误报告 -
SQL错误:ORA-01861:literal与格式字符串不匹配 01861. 00000 - “文字与格式字符串不匹配”
*原因:输入中的文字必须与文字中的文字长度相同 格式字符串(前导空格除外)。如果 “FX”修饰符已经打开,文字必须完全匹配, 没有多余的空白。
*操作:更正格式字符串以匹配文字。
答案 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