数据类型转换分为俩种 。
隐式数据类型转换:当源数据的类型和目标数据的类型不同的时候,如果没有转换函数,就会发生隐式转换,也称自动转换。
对于直接赋值转换:
对于表达式赋值:
隐式转换的问题:
性能影响:
隐式转换的最大问题就是转换时会导致索引的无效,进而可能导致全表扫描。当表的数据量很大的时候,产生会很大的性能问题。比如说,VARCHAR2 和 NVARCHAR2 隐式数据类型转换导致的性能问题。
不便于阅读:
由于隐式转换使得数据库编程人员和 DBA 难以了解到究竟发生了怎样的类型转换,而且如果代码很多很长的话要查出错误就需要费很大的劲。
显示数据类型转换:通过数据库中的转换函数完成数据类型的转换。
数字,日期转换成字符:
TO_CHAR(arg1,’fmt’):将一个日期或者数字转换为字符类型。带格式化样式 fmt。
arg1:数字或者日期类型。需要转换的数据。
fmt:转换格式。
SQL> select to_char(sysdate,\'month\') from dual;
TO_CHAR(SYSDATE,\'MONTH\')
------------------------
7月
SQL> select to_char(sysdate,\'dd\') from dual;
TO_CHAR(SYSDATE,\'DD\')
---------------------
31
SQL> select to_char(sysdate,\'day\') from dual;
TO_CHAR(SYSDATE,\'DAY\')
----------------------
星期三
SQL> select to_char(sysdate,\'dy\') from dual;
TO_CHAR(SYSDATE,\'DY\')
---------------------
星期三
SQL> select to_char(sysdate,\'yyyy\') from dual;
TO_CHAR(SYSDATE,\'YYYY\')
-----------------------
2019
SQL> select to_char(sysdate,\'year\') from dual;
TO_CHAR(SYSDATE,\'YEAR\')
------------------------------------------
twenty nineteen
SQL> select to_char(sysdate,\'mm\') from dual;
TO_CHAR(SYSDATE,\'MM\')
---------------------
07
SQL> select to_char(sysdate,\'cc\') from dual;
TO_CHAR(SYSDATE,\'CC\')
---------------------
21
SQL> select to_char(sysdate,\'scc\') from dual;
TO_CHAR(SYSDATE,\'SCC\')
----------------------
21
SQL> select to_char(sysdate,\'iyyyy\') from dual;
TO_CHAR(SYSDATE,\'IYYYY\')
------------------------
20199
SQL> select to_char(sysdate,\'iyy\') from dual;
TO_CHAR(SYSDATE,\'IYY\')
----------------------
019
SQL> select to_char(sysdate,\'bc\') from dual;
TO_CHAR(SYSDATE,\'BC\')
---------------------
公元
SQL> select to_char(sysdate,\'q\') from dual;
TO_CHAR(SYSDATE,\'Q\')
--------------------
3
SQL> select to_char(sysdate,\'am\') from dual;
TO_CHAR(SYSDATE,\'AM\')
---------------------
下午
SQL> select to_char(sysdate,\'hh\') from dual;
TO_CHAR(SYSDATE,\'HH\')
---------------------
02
SQL> select to_char(sysdate,\'hh12\') from dual;
TO_CHAR(SYSDATE,\'HH12\')
-----------------------
02
SQL> select to_char(sysdate,\'hh24\') from dual;
TO_CHAR(SYSDATE,\'HH24\')
-----------------------
14
SQL> select to_char(sysdate,\'mi\') from dual;
TO_CHAR(SYSDATE,\'MI\')
---------------------
32
SQL> select to_char(sysdate,\'mi:ss\') from dual;
TO_CHAR(SYSDATE,\'MI:SS\')
------------------------
32:39
SQL> select to_char(sysdate,\'ddspth\') from dual;
TO_CHAR(SYSDATE,\'DDSPTH\')
-------------------------
thirty-first
示例:显示所有雇员的名字和受雇日期,受雇日期以 2007 年 8 月 10 日 12:00:00AM 显示。
SQL> select last_name,salary,to_char(hire_date,\'yyyy"年 "mm"月 "dd"日" hh:mi:ss am\') from employees where salary<5000;
LAST_NAME SALARY TO_CHAR(HIRE_DATE,\'YYYY"年"MM"
------------------------- ---------- ------------------------------
Austin 4800.00 2005年 06月 25日 12:00:00 上午
Pataballa 4800.00 2006年 02月 05日 12:00:00 上午
Lorentz 4200.00 2007年 02月 07日 12:00:00 上午
Khoo 3100.00 2003年 05月 18日 12:00:00 上午
Baida 2900.00 2005年 12月 24日 12:00:00 上午
Tobias 2800.00 2005年 07月 24日 12:00:00 上午
Himuro 2600.00 2006年 11月 15日 12:00:00 上午
Colmenares 2500.00 2007年 08月 10日 12:00:00 上午
数字转换:
FM:代表去掉返回结果中的前后空格。
SQL> select to_char(123687.146,\'999,999.999\') from dual;
TO_CHAR(123687.146,\'999,999.99
------------------------------
123,687.146
SQL> select to_char(123687.1464,\'999,999.999\') from dual;
TO_CHAR(123687.1464,\'999,999.9
------------------------------
123,687.146
SQL> select to_char(123646487.1464,\'999,999.999\') from dual;
TO_CHAR(123646487.1464,\'999,99
------------------------------
############
SQL> select to_char(646487.1464,\'$999,999.999\') from dual;
TO_CHAR(646487.1464,\'$999,999.
------------------------------
$646,487.146
SQL> select to_char(646487.1464,\'L999,999.999\') from dual;
TO_CHAR(646487.1464,\'L999,999.
------------------------------
¥646,487.146
SQL> select to_char(646487.1464,\'l999,999.999\') from dual;
TO_CHAR(646487.1464,\'L999,999.
------------------------------
¥646,487.146
SQL> select to_char(646487.1464,\'fml999,999.999\') from dual;
TO_CHAR(646487.1464,\'FML999,99
------------------------------
¥646,487.146
SQL> select to_char(646487.1464,\'fm$999,999.999\') from dual;
TO_CHAR(646487.1464,\'FM$999,99
------------------------------
$646,487.146
示例:查询雇员 Whalen,显示他的薪水,在薪水前添加美元符号与千位符。
SQL> select last_name,salary,to_char(salary,\'fm$999,999.999\') from employees where lower(last_name)=\'whalen\';
LAST_NAME SALARY TO_CHAR(SALARY,\'FM$999,999.999
------------------------- ---------- ------------------------------
Whalen 4400.00 $4,400.
to_number 字符串到数字转换
TO_NUMBER(‘arg1’,fmt’):将字符串转换为数值型的格式。带格式化样式 fmt。
arg1:字符串类型。需要转换的数据。
fmt:转换格式。
SQL> select to_number(\'¥440.00\',\'l999,999.999\') from dual;
select to_number(\'¥4400.00\',\'l999,999.999\') from dual
ORA-01722: 无效数字
SQL> select to_number(\'¥440.00\',\'l999,999.999\') from dual;
TO_NUMBER(\'¥440.00\',\'L999,999
-----------------------------
440
SQL>
SQL> select to_number(\'¥464,400.00\',\'l999,999.999\') from dual;
TO_NUMBER(\'¥464,400.00\',\'L999
-----------------------------
464400
TO_DATE(‘arg1’,’fmt’):将字符串转换为日期格式。带格式化样式 fmt。
arg1:字符串类型。需要转换的数据。
fmt:转换格式。
SQL> select to_date(\'2019/02/16\',\'yyyy-mm-dd\') from dual;
TO_DATE(\'2019/02/16\',\'YYYY-MM-
------------------------------
2019/2/16
SQL> select to_date(\'20190216\',\'yyyy-mm-dd\') from dual;
TO_DATE(\'20190216\',\'YYYY-MM-DD
------------------------------
2019/2/16
示例:将 2019 年 3 月 9 日 11 点 30 分转换为 Date 类型
SQL> select to_date(\'2019年 3月 9日 11点 30分\',\'yyyy"年" mm"月" dd"日" hh12"点" mi"分"\') from dual;
TO_DATE(\'2019年3月9日11点30分\'
-------------------------
2019/3/9 11:30:00
注意:空格也是格式,一定要看清楚:
SQL> select to_date(\'2019年3月9日11点30分\',\'yyyy"年" mm"月" dd"日" hh12"点" mi"分"\') from dual;
select to_date(\'2019年3月9日11点30分\',\'yyyy"年" mm"月" dd"日" hh12"点" mi"分"\') from dual
ORA-01861: 文字与格式字符串不匹配