ORACLE TO_CHAR的一个问题

简介:
 在完成一个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!博客51CTO博客,原文链接http://blog.51cto.com/miracle/88173如需转载请自行联系原作者


Larry.Yue

相关文章
|
8月前
|
机器学习/深度学习 人工智能 Oracle
在Oracle中,TO_CHAR()、TO_NUMBER()和TO_DATE()函数的使用方法以及作用
在Oracle中,TO_CHAR()、TO_NUMBER()和TO_DATE()函数的使用方法以及作用
233 0
Zp
|
SQL Oracle 关系型数据库
Oracle 通过sql to_date()和 to_char() 转化日期格式
Oracle 通过sql to_date()和 to_char() 转化日期格式
Zp
384 0
Oracle 通过sql to_date()和 to_char() 转化日期格式
|
移动开发 Oracle 关系型数据库
Oracle to_char 函数
Oracle to_char 函数
563 0
|
SQL Oracle 关系型数据库
[沫沫金原创]Oracle去除Date时分秒 不用to_char然后再to_date这么麻烦
1、你是否在Sql编写中遇到Datetime类型,只想保留到日期去除时分秒呢? 2、你是否需要繁琐的进行date转varchar再转回date? 现在,告诉所有亲:不用这么麻烦! select trunc(sysdate) from dual  --2013-01-06 直接就OK,从此轻装上阵,带你装逼带你飞。
1843 0
|
Oracle 关系型数据库
|
Oracle 关系型数据库
|
Oracle 关系型数据库
oracle Extract,to_char 函数
//oracle中extract()函数从oracle 9i中引入,用于从一个date或者interval类型中截取到特定的部分   //语法如下:   EXTRACT...
926 0
|
Oracle 关系型数据库 MySQL
oracle、sqlserver、mysql常用函数对比[to_char、to_number、to_date]
oracle                                       -->                             mysql to_char(sysdate,'yyyy-mm-dd')-->date_format(sysdate(),'%Y-%m-%d');t...
2201 0

推荐镜像

更多