TO_DATE()方法
首先从在网上看到别人to_date()方法的使用如下:
SELECT TO_DATE('2006-05-01 19:25:34', 'YYYY-MM-DD HH24:MI:SS') FROM DUAL
//结果:2006/5/1 19:25:34
SELECT TO_DATE('2006-05-01 19:25', 'YYYY-MM-DD HH24:MI') FROM DUAL
//结果:2006/5/1 19:25:00
SELECT TO_DATE('2006-05-01 19', 'YYYY-MM-DD HH24') FROM DUAL
//结果:2006/5/1 19:00:00
SELECT TO_DATE('2006-05-01', 'YYYY-MM-DD') FROM DUAL
//结果:2006/5/1
SELECT TO_DATE('2006-05', 'YYYY-MM') FROM DUAL
//结果:2006/5/1
SELECT TO_DATE('2006', 'YYYY') FROM DUAL
//结果:2006/3/1
测试之后发现的确能够使用。
而我也发现了一个有趣的问题。
1、第二和第三条语句没有SS或MI,但在对应的位置会自动添加上00
2、第五和第六两条语句没有DD或MM,但在DD的位置自动添加上了1,在MM位置为查询时的系统月份。
结论:当转换模版存在HH时,如果MI或SS缺失则会补上00;当转换模版存在YYYY,如果MM缺失则会补上当前系统月份,DD缺失则会补上1。
值得说明的是TO_DATE()方法的第二个参数是时间的格式化模版,分别如下:
模版字符 | 代表值 |
---|---|
YYYY | 年 |
MM | 月 |
DD | 日 |
HH | 小时(12小时制) |
HH24 | 小时(24小时制) |
MI | 分钟 |
SS | 秒 |
此时我就在想YYYY代表年,是指年一定要4位数吗?还是说YYY也可以代表年于是我觉得测试一下:
SELECT TO_DATE('2006', 'YYY') FROM DUAL
结果显示:
之后我又测试了当日期只有一个数字时即将“2016-05”修改为“2016-5”时使用模版“YYYY-M”来转换也报同样的错误。
之后我查阅资料发现其实是可以使用“YYY”和“YY”,“Y”的,只不过转换的字符位数也要和模版位数一致。
他们代表的其实是:
模版字符 | 代表值 |
---|---|
YYY | 年后三位 |
YY | YY比较复杂,大家观察下面的代码自己体会一下 |
Y | 年后一位 |
SELECT TO_DATE('6', 'Y') FROM DUAL
SELECT TO_DATE('16', 'YY') FROM DUAL
SELECT TO_DATE('016', 'YYY') FROM DUAL
//结果都为:2016/3/1
SELECT TO_DATE('2016', 'YY') FROM DUAL
//结果:2016/3/1
SELECT TO_DATE('016', 'YY') FROM DUAL
//结果:0016/3/1
SELECT TO_DATE('6', 'YY') FROM DUAL
//结果:2006/3/1
SELECT TO_DATE('0', 'YY') FROM DUAL
//结果:2000/3/1
最后我在plsql中找到了TO_DATE()函数的模版。
双击模版发现出现的代码有三个参数:
To_date(char, format, nlsparam)
第一个和第二个参数是什么我们都已经知道了:
char:需要转换的字符;
format:字符转date格式化模版;
那么第三个参数是什么呢?
nlsparam:?
查阅资料发现nlsparam其实是一个表达式,用于指定日期和月份名称的语言,且不是必须的参数。该参数的格式如下:NLS_DATE_LANGUAGE = language
通过这个参数我们能做什么呢?看下面的代码:
SELECT TO_DATE('January 15, 1989, 11:00 A.M.','Month dd, YYYY, HH:MI A.M.','NLS_DATE_LANGUAGE = American') FROM DUAL;
//结果:1989/1/15 16:00:00
通过nlsparam参数我们转换字符串为日期型格式就不仅限于阿拉伯数字的字符串了,还能使用不同的语言来实现。
SELECT TO_DATE('1月 15, 1989, 11:00','Month dd, YYYY, HH:MI','NLS_DATE_LANGUAGE = ''SIMPLIFIED CHINESE''') FROM DUAL;
//结果:1989/1/15 11:00:00
NLS_DATE_LANGUAGE = ‘‘SIMPLIFIED CHINESE’’,NLS_DATE_LANGUAGE的值为’‘SIMPLIFIED CHINESE’‘时表示为中文,有意思的是这里的两组单引号’’’'是不能省略的。而英文的American却不需要引号。
TO_CHAR()方法
该方法的内容我在网上看到一篇非常详细的博客连接如下:Oracle to_char函数的使用方法