首页 新闻 会员 周边 捐助

关于ORA-01861: literal does not match format string

0
悬赏园豆:100 [已关闭问题]

.Net执行SQL时报的错误,我的查询SQL时间条件是:"时间 >= '2010-5-1' and 时间 <= sysdate",环境变量NLS_DATE_FORMAT都配好了,变量值为YYYY-MM-DD HH24:MI:SS。本机调试执行没问题,Toad和PL/SQL执行也都没问题,但是部署到IIS上执行就报错:ORA-01861: literal does not match format string,条件改成"时间 >= to_date('2010-5-1','YYYY-MM-DD') "就没事。为什么本机调试没问题,部署到IIS就会报错(部署也在我本机)?
顺便问下"时间 >= to_date('2010-5-1','YYYY-MM-DD')"这样查破坏了时间索引吗,不是只要左边查询字段(时间)不加函数处理就不会影响索引吗?那为什么速度差别这么大?不加to_date()查询只要2,3秒,但是加上后就70,80秒的样子

问题补充: 我知道是字符串匹配问题,我的需求是不使用to_date函数,因为在这里to_date函数严重影响了查询速度,按道理来说是不应该的。所以我只能配环境变量,但是部署运行就是报错,而调试Debug就没问题
马克去去的主页 马克去去 | 初学一级 | 园豆:15
提问于:2010-05-11 13:06
< >
分享
其他回答(3)
0

1). ORA-01861: 文字与格式字符串不匹配

2). 必须指定日期格式
    to_date('2010-05-11 14:20:24' , 'yyyy-mm-dd hh24:mi:ss')

3). 比较时间也可以将数据的时间字段to_char('时间','yyyy-mm-dd hh24:mi:ss').变成字符串,再去按字符串比较.
    当然你的字符串'2010-5-1'也要to_char(to_date('2010-5-1','yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss').

三阶 | 园豆:1636 (小虾三级) | 2010-05-11 14:21
出现ORA-01861的原因不知道,遇到了我也就老老实实加上格式字符串.
支持(0) 反对(0) 三阶 | 园豆:1636 (小虾三级) | 2010-05-11 14:22
肯定可以不用指定的,因为我们以前项目都能这么用,还是环境变量问题,在这里我不想用To_date主要是因为太影响速度了,难道to_char了还可以进行时间上的大小比较吗?
支持(0) 反对(0) 马克去去 | 园豆:15 (初学一级) | 2010-05-11 14:40
@马克去去: 当然可以,to_char之后,就全部都是字符串了.肯定可以比较.这种用法做了好多项目了.
支持(0) 反对(0) 三阶 | 园豆:1636 (小虾三级) | 2010-05-11 14:42
@佳文:还有就是平常to_date都不用加格式化字符串,如果真的出了问题找不到原因,就只能曲线救国了.
支持(0) 反对(0) 三阶 | 园豆:1636 (小虾三级) | 2010-05-11 14:44
@佳文:但是如果to_char(时间)不就把时间索引破坏了吗,同样速度还是上不来了,我是为了提高速度啊
支持(0) 反对(0) 马克去去 | 园豆:15 (初学一级) | 2010-05-11 14:52
你说的倒没错.性能肯定下去了.
支持(0) 反对(0) 三阶 | 园豆:1636 (小虾三级) | 2010-05-11 15:10
从在线帮助TO_DATE ( string [, format [, nls_param]] ) return [ datetime ]来看, TO_Date()加上后面的format 肯定没错.找到这种奇怪的问题在告诉你吧...
支持(0) 反对(0) 三阶 | 园豆:1636 (小虾三级) | 2010-05-11 15:20
@佳文:谢谢了,主要1,我不用to_date()函数,直接查时间 >= '2010-5-1' 。2,开发环境debug没事,但是部署了运行就报错
支持(0) 反对(0) 马克去去 | 园豆:15 (初学一级) | 2010-05-11 15:25
0

时间 >= '2010-5-1' and 时间 <= sysdate,这里出错是因为数据类型不匹配引起的吧,不太了解Oracle。刚查了一下,网上出现这个错误的还不少。

Astar | 园豆:40805 (高人七级) | 2010-05-11 14:22
我肯定知道是不匹配了,可能你没了解我提问的意思,我是想不加To_date()函数直接用"时间 >= '2010-5-1' "语句查询,因为我配置了环境变量,开发环境中Debug都没问题,但是部署了以后就报这个错误;
支持(0) 反对(0) 马克去去 | 园豆:15 (初学一级) | 2010-05-11 14:38
@马克去去:重装oracle客户端。
支持(0) 反对(0) Astar | 园豆:40805 (高人七级) | 2010-05-11 15:38
0

可以使用OracleParameter。

Launcher | 园豆:45050 (高人七级) | 2010-05-11 15:36
既然拼SQL的方法解决不了,只好用传参方法了,我试过了效率和"时间 >= '2010-5-1'"一样,虽然没找到根本原因,但还是谢谢你的提示
支持(0) 反对(0) 马克去去 | 园豆:15 (初学一级) | 2010-05-17 11:49
1
代码
public static DataTable GetOperateLogByOperateTime(string beginTime, string endTime)
{
string sql = "";

sql
+= "select ol.*,mi.ManagerLoginName from OperateLog ol";
sql
+= " inner join sysManagerInfo mi on mi.ManagerId = ol.ManagerId";
sql
+= " where ol.OperateTime between to_date('" + beginTime + "','yyyy-MM-dd hh24:mi:ss')";
sql
+= " and to_date('" + endTime + "','yyyy-MM-dd hh24:mi:ss') order by ol.OperateId desc";

return DBHelper.GetDataTable(sql);
}

 

我试过了很多方法,在oracle当中,必需要使用to_date()方法才能够正确地查询数据

 

如有其它方法,请指教

一颗烂笔头儿 | 园豆:155 (初学一级) | 2010-05-17 16:36
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册