數據類型轉換分為倆種 。
隱式數據類型轉換:當源數據的類型和目標數據的類型不同的時候,如果沒有轉換函數,就會發生隱式轉換,也稱自動轉換。
對於直接賦值轉換:
對於表達式賦值:
隱式轉換的問題:
性能影響:
隱式轉換的最大問題就是轉換時會導致索引的無效,進而可能導致全表掃描。當表的數據量很大的時候,產生會很大的性能問題。比如說,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: 文字與格式字符串不匹配