ORACLE TO_CHAR的一个问题
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                ORACLE TO_CHAR的一个问题
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.                        
                                
                            
                            
                            在完成一個PL/SQL程序的時候,發(fā)現(xiàn)我寫個一個DECODE判斷總是返回一個值,有問題。那個判斷的細節(jié)是,只要某個日期為所在周的周一,返回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中有這樣的操作一定要多多注意,非常小心,尤其含有地區(qū)或者語言處理的,所以我常常會選擇強制語言再返回信息【'NLS_DATE_LANGUAGE = American'】防止因為程序運行環(huán)境不同而造成返回的信息不同,而使程序運行出錯。
???? -:)
???? -----------------------
???? ORACLE測試環(huán)境:10.2.0.1
???????????????????????????????? 9.2.0.4
? ? ? ? ? ? ????
 
 
                        
                        
                        ???
??? 例如:
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中有這樣的操作一定要多多注意,非常小心,尤其含有地區(qū)或者語言處理的,所以我常常會選擇強制語言再返回信息【'NLS_DATE_LANGUAGE = American'】防止因為程序運行環(huán)境不同而造成返回的信息不同,而使程序運行出錯。
???? -:)
???? -----------------------
???? ORACLE測試環(huán)境:10.2.0.1
???????????????????????????????? 9.2.0.4
? ? ? ? ? ? ????
轉載于:https://blog.51cto.com/miracle/88173
總結
以上是生活随笔為你收集整理的ORACLE TO_CHAR的一个问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: mysql问答汇集
- 下一篇: 图文并茂——使用xfire编写webse
