注册 | 登录 忘记密码? 51cto首页 | 博客 | 论坛 | 招聘
热点文章 利用IPSec实现网络安全之..
 帮助

ORACLE TO_CHAR的一个问题


2008-07-16 22:04:20
 标签:TO_CHAR LENGTH   [推送到技术圈]

版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://miracle.blog.51cto.com/255044/88173
      在完成一个PL/SQL程序的时候,发现我写个一个DECODE判断总是返回一个值,有问题。那个判断的细节是,只要某个日期为所在周的周一,返回1,否则返回0.
   
    例如:
select decode(to_char(to_date(to_char(sysdate, 'yy') || '0714''yymmdd'),'day', 'NLS_DATE_LANGUAGE = American'),
              'monday',1,0)
  from dual;
   
      这是应该返回1,但是运行该SQL,却总是返回0。
      奇怪,怎么搞的。赶快测试了一下长度:
select  length(to_char(TO_DATE(TO_CHAR(SYSDATE, 'yy') ||
                                    '0714',
                                    'yymmdd'),
                            'day',
                            'NLS_DATE_LANGUAGE = American')) from dual;

      返回的长度让我吃惊:9!
      不是我想的6!
      于是我在SQL上加了一个TRIM处理
       select length(trim(to_char(to_date(to_char(sysdate, 'yy') || '0714', 'yymmdd'),
                                  'day',
                                  'NLS_DATE_LANGUAGE = American')))
         from dual;

      终于返回了6!
      于是罗列了一下英文的周一到周日,正好周三(Wednesday)是9个长!
      试了试返回月份的效果,一样,都是9个长。
      试试中文的效果:
     
select lengthb(to_char(to_date('20090707', 'yymmdd'), 'day')) from dual;

      返回了6!和英文的长度不同。然后又测试了月
select lengthb(to_char(to_date('20090707', 'yymmdd'), 'month')) from dual;

      并没有返回6而是4!就是说,象上句,返回的值是'7月 '还是一个带有空格的定长!考虑到12月就应该有一个空格了 -:)
      又和空格纠缠了一把!奇怪ORACLE的返回还是定长。
      如果以后在PL/SQL中有这样的操作一定要多多注意,非常小心,尤其含有地区或者语言处理的,所以我常常会选择强制语言再返回信息【'NLS_DATE_LANGUAGE = American'】防止因为程序运行环境不同而造成返回的信息不同,而使程序运行出错。
     -:)
     -----------------------
     ORACLE测试环境:10.2.0.1
                                 9.2.0.4

                

本文出自 “Be the miracle!” 博客,请务必保留此出处http://miracle.blog.51cto.com/255044/88173





    文章评论
 
2008-07-17 10:49:04
返回值出错有时候是挺郁闷的

2008-07-17 10:50:39
小问题的后面往往会引发更多的问题

 

发表评论

昵   称:
验证码:  点击图片可刷新验证码  博客过2级,无需填写验证码
内   容: