我用8i的客户端 连接一个 ORACLE 9i,有一条to_date语句在 SQLPlus Worksheet 里可以执行,但在 SQL Plus 中却说 “O

  • 主题发起人 主题发起人 wsn
  • 开始时间 开始时间
W

wsn

Unregistered / Unconfirmed
GUEST, unregistred user!
我用8i的客户端 连接一个 ORACLE 9i,有一条to_date语句在 SQLPlus Worksheet 里可以执行,但在 SQL Plus 中却说 “ORA-01861: 文字与格式字符串不匹配”(200分)<br />select list_datetime from tbblacklist where to_date(list_datetime,'YYYY-MM-DD')<sysdate

其中 list_datetime 是一个日期型字段
用select to_char(list_datetime,'YYYY-MM-DD') list_datetime from tbblacklist where list_name='ADF'
查询的结果是:
======================================================================
LIST_DATETIME
--------------
2002-06-02
======================================================================

可是同样的select list_datetime from tbblacklist where to_date(list_datetime,'YYYY-MM-DD')<sysdate
在我的8i的客户端上 的 SQLPlus Worksheet 里却可以执行
而且在9i上无论是 SQLPlus Worksheet 还是 SQL Plus 都能正确执行。
请大家帮帮忙,为什么我的 SQL Plus 会这样?(我身边的其他8i也都如此)
 
还是那条语句在其他的9i的客户端也是相同的出错信息 “ORA-01861: 文字与格式字符串不匹配”
困惑~~[:(]
 
ORA-01861 literal does not match format string

Cause: Literals in the input must be the same length as literals in the format string (with the exception of leading white space). If the "FX" modifier has been toggled on, the literal must match exactly, with no extra white space.

Action: Correct the format string to match the literal.

估计有可能是里面的分隔符的原因。
 
现在知道只要在客户端这么写 to_date(list_datetime,'YYYY-MON-DD')就可以了
刚想起来,我在安装9i的时候因为dos窗口显示中文是乱码,所以就把注册表里的字符集改成
成AMERICA了,现在使得现在我对日期型字段进行to_date转换很难统一起来(也是我经验太少[:(])
现在表里很多日期型字段是 “20002年8月22日...”形式的,如果都这么写
to_date(list_datetime,'YYYY-MON-DD') 到客户那边的时候可能因为中英文字符的影响又要出错,大家有什么好办法吗?

另外:有一个从unix系统里的导出oracle数据库在一台 win2000server 的oracle 上导入的是时候说无法做852 -- 850字符集之间的转换
我现在手上只有一个导出文件,没有去连那个unix oracle的途径,请教我怎么导入这个导出文件?

谢谢
 
小妹只是来看看

最好能骗点分

嘻嘻
 
前面的后续问题没有什么好的办法,最好能够保持所应用的数据库系统中的字符集的统一性。
后面的问题可能有点麻烦,我记不清楚到底是852为850的超集还是反过来。
如果目标数据库的字符集是超集,应该没有问题。
尝试一下:
将DMP文件复制一份,然后通过可进行十六进制文本编辑的软件(如ultraedit等),将文件的
第二和第三字节由0354改为0352,其中0354是852的十六进制表示,而0352是850的十六进制
表示。然后再做IMP。
 
试试把HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/HOME0 的NLS_LANG健值改为
AMERICAN_AMERICA.ZHS16CGB231280
 
>>其中 list_datetime 是一个日期型字段
>>select list_datetime from tbblacklist where to_date(list_datetime,'YYYY-MM-DD')<sysdate
这里我就看不懂了! 为什么还要用to_date呢??? 这样写能得到你要的结果吗?
下面这句才是正确的:
select list_datetime from tbblacklist where list_datetime<sysdate
如果你只要日期而不要存在里面的时间信息,你应该用相应的函数,如TRUNC等

关于字符集的问题,最好不要通过修改文件的方式来强行导入
你应该把你的数据库字符集设成与UNIX一样或是其超集

 
就上面的这个例子来说,用
select list_datetime from tbblacklist where list_datetime<to_date('2002-07-01','YYYY-MM-DD')
可以满足简单一点的查询,只是list_datetime这一日期字段里保存的格式实在花样繁多而且有的是中文有的是英文
我就是不知道怎么做才能让时间格式都统一起来[:(]
 
数据库是没有保存你的时间格式的, 你可以把它看成一个浮点数
之所以有格式(年月日)显示出来,是在客户端处理的时候才显示的
你如果要把时间格式统一起来,在显示的时候用to_char转换成你要的格式就行了
比较的时候list_datetime<to_date('2002-07-01','YYYY-MM-DD')在任何数据库都是成立的
 
select list_datetime from tbblacklist where to_date(list_datetime,'YYYY-MM-DD')<sysdate
可以改为
select list_datetime from tbblacklist where list_datetime<sysdate
用两个日期型的直接比较!

 
还没搞定吗?
 
不好意思,忘了结束了
谢谢大家的帮助,启发很大。

另请关注这里 :
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1289030
我安装完ORACLE9i以后连接的时候一直说 [未找到提供者,可能未正确安装]
 
后退
顶部