您的位置:首页 > 数据库 > Oracle

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

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

题目:



答案解释:这个题目比较简单,写这篇的目的,是想多了解一下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语句三层的变量之间的区别;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: