ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 使用nlsparam的一个例子

使用nlsparam的一个例子

原创 Linux操作系统 作者:yangtingkun 时间:2008-01-05 23:24:47 0 删除 编辑

过完元旦,人变的很懒,先记录一个简单的小东西吧。

Pub上看到一个有趣的问题:http://www.itpub.net/thread-922114-1-1.html,再解决这个问题的时候,使用了TO_CHAR里面的NLSPARAM参数,由于平常不常使用这个参数,简单做个记录。

 

 

将楼主的问题简化一下,如果当前的为星期一那么输出结果就是“一”,如果当前的结果是周二,那么输出结果就是“二”。

检查星期几的最简单方法就是通过TO_CHAR函数的’D’格式输出:

SQL> SELECT TO_CHAR(SYSDATE, 'D') FROM DUAL;

T
-
7

SQL> SELECT TO_CHAR(SYSDATE, 'DAY') FROM DUAL;

TO_CHAR(SYSDA
-------------
SATURDAY

但是现在面临两个问题,一个是输出的是数字,另一个问题是根据Oracle的规则,星期日返回1,星期一返回2,星期二返回3,星期六返回7,也就是说Oracle返回的结果比中国习惯大一天,而且周日的差别很大。

当然可以通过DECODE来轻松的实现转化:

SQL> SELECT
  2   DECODE(TO_CHAR(SYSDATE, 'D'),
  3    1, '
',
  4    2, '
',
  5    3, '
',
  6    4, '
',
  7    5, '
',
  8    6, '
',
  9    7, '
')
 10  FROM DUAL;

DE
--

不过这种硬编码的方式实在太土了。尝试采用其他的方法来解决这个问题。

由于在中文条件下,TO_CHAR函数的’DAY’格式输出本身可以包括中文数字信息:

SQL> ALTER SESSION SET NLS_DATE_LANGUAGE = 'SIMPLIFIED CHINESE';

会话已更改。

SQL> SELECT TO_CHAR(SYSDATE, 'DAY') FROM DUAL;

TO_CHAR(S
---------
星期六

下面只需要通过SUBSTR来取第三个字就可以解决上面的两个问题:

SQL> SELECT SUBSTR(TO_CHAR(SYSDATE, 'DAY'), 3, 1) FROM DUAL;

SU
--

到现在为止还没有使用NLSPARAM参数,而问题似乎已经解决。其实不然,得到上面的结果有一个前提,中文格式的日期输出。

由于不可能要求用户在执行SQL之前先执行ALTER SESSION SET NLS_DATE_LANGUAGE = 'SIMPLIFIED CHINESE'语句,在这种情况下仍然要保证中文格式的输出,就要靠NLSPARAM参赛了。

SESSION级的设置会覆盖SYSTEM级的设置,而调用函数时指定的参数设置会覆盖SESSION级的设置。也就是说,在调用函数时指定的参数的优先级最高。所以这里使用包含NLSPARAM参数的TO_CHAR来确保日期中文格式输出。

注意由于SIMPLIFIED CHINESE语言中间包括空格,因此必须使用单引号来引起来作为一个总体:

SQL> SELECT SUBSTR(TO_CHAR(SYSDATE, 'DAY'), 3, 1) FROM DUAL;

SU
--
T

SQL> SELECT
  2   SUBSTR(
  3    TO_CHAR(
  4     SYSDATE,
  5     'DAY',
  6     'NLS_DATE_LANGUAGE=''SIMPLIFIED CHINESE'''),
  7    3,
  8    1)
  9  FROM DUAL;

SU
--

通过使用NLSPARAM参数确保这个结果在任何环境下执行都可以得到正确的答案。不过需要注意,如果显示终端没有安装中文环境的话,虽然结果是正确的,但是屏幕显示的仍然是乱码。不过这个就和OracleSQL语句没有关系了。

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-103734/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2007-12-29

  • 博文量
    1955
  • 访问量
    10488276