每天写写博客,多么惬意,不过认真阅读别人的博客也是挺好的习惯,同时,写一篇值得别人看的博客更是好的习惯。如果有一天咱转行了,至少留下了足迹。。。
题目:
答案解释:这个题目比较简单,写这篇的目的,是想多了解一下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语句三层的变量之间的区别;