Oracle中日期类型的问题

wangkainet 2010-09-01 05:12:07
出错环境
服务器数据库版本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即可正常显示和使用了。不过我希望有更加好的解决方法。

...全文
291 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
hyl04 2010-09-07
  • 打赏
  • 举报
回复
一般情况下不会有负数年份吧?这也不符合实际情况啊!
wangkainet 2010-09-07
  • 打赏
  • 举报
回复
这确实属于业务系统中的脏数据,只能请业务部门修正数据了
wangkainet 2010-09-06
  • 打赏
  • 举报
回复
最终还是没有搞清楚怎么回事,不过又发现了一个奇怪的现象,就是我在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
至于服务器的环境,因为没有权限所以不知道,但至少是支持中文的,因为里面的汉字都能正常显示。
wangkainet 2010-09-06
  • 打赏
  • 举报
回复
我终于发现问题的原因了
其实那个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存储负数年的机制比较特殊?其他数据库没试过)。不知道对不对?
请各位高人发表下意见。

如果没有意见明天结贴了。
hjch1982 2010-09-02
  • 打赏
  • 举报
回复
查看下系统日期格式设置.
minitoy 2010-09-02
  • 打赏
  • 举报
回复
show parameter nls
看看服务器和本级设置一致么
wangkainet 2010-09-02
  • 打赏
  • 举报
回复
Robin_Ares的意思是两个数据库的字符集是不同的是吗?
我之前忘了说,服务器是GBK的,客户端工具默认应该也是GBK的。
你说的修改日期格式是不是alter session set nls_date_format='yyyy-mm-dd hh:mi:ss';
我试了,不行呀。

请Robin_Ares说明白点,谢谢
wangkainet 2010-09-02
  • 打赏
  • 举报
回复
谢谢minitory和hjch1982,可以我没有权限查看别人业务系统日期格式,不过我会在自己的机器上试着模拟一下的,谢谢两位。
robin_ares 2010-09-01
  • 打赏
  • 举报
回复
和32位64位没什么关系吧
应该和系统的语言有关系,不同的语言下显示格式不同
,所以要指定日期格式
wangkainet 2010-09-01
  • 打赏
  • 举报
回复
可能是位数的问题,不过手头没有64位机器让我测试一下,呵呵。总之谢谢了
Cike121272604 2010-09-01
  • 打赏
  • 举报
回复
应该是64位和32位的问题,这种问题我认为用to_date 和to_char是最好的解决办法。
ngx20080110 2010-09-01
  • 打赏
  • 举报
回复
不懂其中的道理,期待大师的解释

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧