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 >= 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.DataAccess.Client.OracleException: ORA-00900: 无效的 SQL 语句