过完元旦,人变的很懒,先记录一个简单的小东西吧。
在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&IhT'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;]2dH
---------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个人空间)?%qk wi$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参数确保这个结果在任何环境下执行都可以得到正确的答案。不过需要注意,如果显示终端没有安装中文环境的话,虽然结果是正确的,但是屏幕显示的仍然是乱码。不过这个就和Oracle的SQL语句没有关系了。