出错环境
服务器数据库版本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即可正常显示和使用了。不过我希望有更加好的解决方法。
服务器数据库版本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即可正常显示和使用了。不过我希望有更加好的解决方法。
我之前忘了说,服务器是GBK的,客户端工具默认应该也是GBK的。
你说的修改日期格式是不是alter session set nls_date_format='yyyy-mm-dd hh:mi:ss';
我试了,不行呀。请Robin_Ares说明白点,谢谢
看看服务器和本级设置一致么
而其他正确的日期显示为诸如"16-三月-04 20:40:52"我用select userenv('language') from dual看了一下,为SIMPLIFIED CHINESE_CHINA.ZHS16GBK
至于服务器的环境,因为没有权限所以不知道,但至少是支持中文的,因为里面的汉字都能正常显示。
其实那个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存储负数年的机制比较特殊?其他数据库没试过)。不知道对不对?
请各位高人发表下意见。如果没有意见明天结贴了。