出错环境
服务器数据库版本10.0.2 64位
客户端版本      10.0.1 32位服务器上的一个表有一个日期字段存储的日期为 0817-1-22(817年1月22号)
使用select installdate from table where to_char(installdate, 'yyyy')='0817'
在plsqldev工具中显示为        0000-0-00(显示错误)
在Oracle工具sql plus中显示为 22-1月 -17(显示正确,不要怀疑就是这么显示的)
这样取出的日期在某些情况下使用会报日期类型不正确的错误我在我自己机器上模拟了一个类似环境
服务器数据库版本10.0.1 32位
客户端版本      10.0.1 32位同样使用上面的sql查询
在plsqldev工具中显示为        0817-1-22(显示正确)
在Oracle工具sql plus中显示为 22-1月 -17(显示正确)
这样取出的日期可以正常使用我想问一下是什么原因产生第一种情况中的错误,应该怎样解决才行。
我能想到的可能原因:
1.64位和32位之间不兼容?
2.客户端和服务器版本不同?(10.0.1和10.0.2有这么大差别吗)我现在的解决方法:
to_char后再to_date即可正常显示和使用了。不过我希望有更加好的解决方法。

解决方案 »

  1.   

    应该是64位和32位的问题,这种问题我认为用to_date 和to_char是最好的解决办法。
      

  2.   

    Robin_Ares的意思是两个数据库的字符集是不同的是吗?
    我之前忘了说,服务器是GBK的,客户端工具默认应该也是GBK的。
    你说的修改日期格式是不是alter session set nls_date_format='yyyy-mm-dd hh:mi:ss';
    我试了,不行呀。请Robin_Ares说明白点,谢谢
      

  3.   

    show parameter nls
    看看服务器和本级设置一致么
      

  4.   

    谢谢minitory和hjch1982,可以我没有权限查看别人业务系统日期格式,不过我会在自己的机器上试着模拟一下的,谢谢两位。
      

  5.   

    最终还是没有搞清楚怎么回事,不过又发现了一个奇怪的现象,就是我在plsqldev的preference中的date and time中设置日期格式为Oracle格式(默认是Windows格式),结果竟然变为"00-h:mm:ss-00 4:42:25"(原来是"0000-0-0 4:42:25"),感觉系统把日期位置的数据识别成时间了?
    而其他正确的日期显示为诸如"16-三月-04 20:40:52"我用select userenv('language') from dual看了一下,为SIMPLIFIED CHINESE_CHINA.ZHS16GBK
    至于服务器的环境,因为没有权限所以不知道,但至少是支持中文的,因为里面的汉字都能正常显示。
      

  6.   

    我终于发现问题的原因了
    其实那个0817-1-2不是817年1月22日,而是-817年,Oracle中'-817-1-22'和'817-1-22'使用To_char后,都是08170122。
    结果今天使用Add_months函数是发现是一个负数的年,如果加的月份足够(比如12000),将结果变为一个正数的年,就可以在plsqldev中正常显示了。我再我自己的环境中做了一个测试,-817年在plsqldev中也是0000年。所以我感觉是:非Oracle的工具,比如plsqldev和sagent(我现在用的一个ETL工具)对于Oracle存储负数年的支持不到位(可能Oracle存储负数年的机制比较特殊?其他数据库没试过)。不知道对不对?
    请各位高人发表下意见。如果没有意见明天结贴了。