Oracle SQL - DATE 大于语句

Posted

技术标签:

【中文标题】Oracle SQL - DATE 大于语句【英文标题】:Oracle SQL - DATE greater than statement 【发布时间】:2015-08-13 20:48:57 【问题描述】:

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

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

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

命令行错误:10 列:25

块引用

错误报告-

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

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

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

【问题讨论】:

您的日期是存储为DATE 还是VARCHAR 'DATE' 存储为这样,我无法使用 to_date 转换它们 【参考方案1】:

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

【讨论】:

【参考方案2】:

由于您的查询字符串是文字,并且假设您的日期正确存储为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');

【讨论】:

谢谢你,我偶然发现了你的答案,它给了我正确的答案。但是你能解释一下为什么WHERE created &gt;= Convert(datetime, '2014-04-01') 不起作用吗?说语法错误。 @NicholasHumphrey Convert 与日期时间转换无关,而是用于字符集之间的转换(Latin-1 到 ASCII 等)【参考方案3】:

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

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

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

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');

【讨论】:

以上是关于Oracle SQL - DATE 大于语句的主要内容,如果未能解决你的问题,请参考以下文章

oracle: sql语句报ora-01461/ora-00911错误

oracle的IMU和ora-01555

Oracle.DataAccess.Client.OracleException: ORA-00900: 无效的 SQL 语句

sql语句怎么来对日期进行相加减

如何让Oracle识别英文日期格式

填坑ORA-01846 周中的日无效