我申请这个blog是为了督促自己,把自己平时的一些想法和思考结果保留下来。 本博客所有内容均为原创,如有转载请注明作者和出处

使用nlsparam的一个例子

上一篇 / 下一篇  2008-01-05 23:24:47 / 个人分类:ORACLE

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

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
X-j+d t e;F9A2Km0-
7~)]\ oEQ#C07

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

TO_CHAR(SYSDA
!qe"W-Q*A Zu[Z4\JX0-------------
?k,~,GJ+? Tk0SATURDAY

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

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

SQL> SELECTITPUB个人空间.j6Xt+}3};D
  2   DECODE(TO_CHAR(SYSDATE, 'D'),ITPUB个人空间:h7k;J2A2N
  3    1, '
',
z(ZFNII0  4    2, '
',
B D;k7^:_#n0  5    3, '
',
q:f&Ih T'r+f0  6    4, '
',ITPUB个人空间"}`#L`d!J
  7    5, '
',
nh(~%E}0O0  8    6, '
',ITPUB个人空间[U}+vSX
  9    7, '
')ITPUB个人空间e!S1T,z? mf
 10  FROM DUAL;

DEITPUB个人空间:nY c5d;e\
--ITPUB个人空间7N_&{3@\:} F

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

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

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

会话已更改。

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

TO_CHAR(SITPUB个人空间LvjId;]2d H
---------ITPUB个人空间uf }+SEv
星期六

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

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

SUITPUB个人空间,S}%}L|/y
--ITPUB个人空间:My h1x8S6` |;z\

到现在为止还没有使用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
Jfk6\G1}.lt~0--ITPUB个人空间)?%qkwi$A
T

SQL> SELECT
[-OL6C4CuH,g l7b0  2   SUBSTR(
9R yO!m;~NC0  3    TO_CHAR(ITPUB个人空间2EG(rA;Ze9S
  4     SYSDATE,ITPUB个人空间f,v*tE#K3l1K
  5     'DAY',
v(mu x N*{0  6     'NLS_DATE_LANGUAGE=''SIMPLIFIED CHINESE'''),
jM4\~!Y$`E0  7    3,ITPUB个人空间 R[Q m/D
  8    1)
"CbCE%i aSJKcN0  9  FROM DUAL;

SUITPUB个人空间Gurwj7z
--
1K+U|ViH|0

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

 


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar