oracle: OCA-047-题解与实验(10)--SQL语句中to_date的用法

每天写写博客,多么惬意,不过认真阅读别人的博客也是挺好的习惯,同时,写一篇值得别人看的博客更是好的习惯。如果有一天咱转行了,至少留下了足迹。。。

题目:

答案解释:这个题目比较简单,写这篇的目的,是想多了解一下to_date这个函数。

语法是:

TO_DATE(char [, fmt [, 'nlsparam' ] ])
SELECT TO_DATE(
    'January 15, 1989, 11:00 A.M.',
    'Month dd, YYYY, HH:MI A.M.',
    'NLS_DATE_LANGUAGE = American')
FROM DUAL;

TO_DATE('
---------
15-JAN-89

上面是官方的示例,还是比较复杂的,多数大家都用不到,'January 15, 1989, 11:00 A.M.是原字符串(对应char)也就是你希望将他转成date格式,而'Month dd, YYYY, HH:MI A.M.就是对这个字符串的解释(对应fmt),表示哪些是星期、日期、年、小时等等,oracle是通过查找fmt里面的关键字来定位char的。

这里要着重说一下NLS_DATE_LANGUAGE的作用,由于字符串里有January及fmt里有Month,显然这是美语的日期格式,如果数据库默认日期语言就是美语的格式,可以略去该变量的指定,直接to_date(char, fmt)就可以了,但是如果是这样的情况:to_date( '08-8月-2007 ','DD-MON-YYYY')能成功么?做下面这个试验:

SQL> select * from nls_session_parameters;
 
PARAMETER                                                    VALUE
------------------------------------------------------------ --------------------------------------------------------------------------------
NLS_LANGUAGE                                                 AMERICAN
NLS_TERRITORY                                                AMERICA
NLS_CURRENCY                                                 $
NLS_ISO_CURRENCY                                             AMERICA
NLS_NUMERIC_CHARACTERS                                       .,
NLS_CALENDAR                                                 GREGORIAN
NLS_DATE_FORMAT                                              DD-MON-RR
NLS_DATE_LANGUAGE                                            AMERICAN
NLS_SORT                                                     BINARY
NLS_TIME_FORMAT                                              HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT                                         DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT                                           HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT                                      DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY                                            $
NLS_COMP                                                     BINARY
NLS_LENGTH_SEMANTICS                                         BYTE
NLS_NCHAR_CONV_EXCP                                          FALSE
 
17 rows selected
 
SQL> SELECT TO_DATE('08-08-2007 ','DD-MM-YYYY') FROM DUAL;
 
TO_DATE('08-08-2007','DD-MM-YY
------------------------------
2007/8/8
 
SQL> SELECT TO_DATE('08-08-2007 ','DD-MON-YYYY') FROM DUAL;
 
SELECT TO_DATE('08-08-2007 ','DD-MON-YYYY') FROM DUAL
 
ORA-01843: not a valid month
 
SQL> SELECT TO_DATE('08-August-2007 ','DD-MON-YYYY') FROM DUAL;
 
TO_DATE('08-AUGUST-2007','DD-M
------------------------------
2007/8/8
 
SQL> SELECT TO_DATE('20111120','YYYYMMDD')FROM DUAL;
 
TO_DATE('20111120','YYYYMMDD')
------------------------------
2011/11/20
 
SQL> SELECT TO_DATE('08-8月-2007 ','DD-MON-YYYY') FROM DUAL;
 
SELECT TO_DATE('08-8月-2007 ','DD-MON-YYYY') FROM DUAL
 
ORA-01843: not a valid month
 
SQL> 
SQL> SELECT TO_DATE('08-8月-2007 ','DD-MON-YYYY','NLS_DATE_LANGUAGE=''SIMPLIFIED CHINESE''')
  2  FROM DUAL;
 
TO_DATE('08-8月-2007','DD-MON-
------------------------------
2007/8/8
 
SQL> 

是否明白了一些呢,上面说明了以下几点:

1、MON和MM都是指月份,但是他们要求的字符串不同,MON如果是8月就要求是‘August‘,中文就是‘8月’,其他年、日都是类似的;

2、需要转换的字符串和数据库(或是session)的NLS_DATE_LANGUAGE有出入,就需要在函数里指定该参量了;

3、体会数据库、session、sql语句三层的变量之间的区别;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值