1. 程式人生 > >Oracle中關於to_date(),to_char(),to_number()函式的用法

Oracle中關於to_date(),to_char(),to_number()函式的用法

一、Oracle中的to_date()函式
1、to_date()與24小時製表示法及mm分鐘的顯示:
在使用Oracle的to_date函式來做日期轉換時,很多Java程式設計師也許會直接的採用“yyyy-MM-dd HH:mm:ss”的格式作為格式進行轉換,但是在Oracle中會引起錯誤:“ORA 01810 格式程式碼出現兩次”。
如:select to_date(‘2005-01-01 13:14:20’,’yyyy-MM-dd HH24:mm:ss’) from dual;
原因是SQL中不區分大小寫,MM和mm被認為是相同的格式程式碼,所以Oracle的SQL採用了mi代替分鐘。
select to_date(‘2005-01-01 13:14:20’,’yyyy-MM-dd HH24:mi:ss’) from dual;

2、另要以24小時的形式顯示出來要用HH24
select to_char(sysdate,’yyyy-MM-dd HH24:mi:ss’) from dual;//mi是分鐘
select to_char(sysdate,’yyyy-MM-dd HH24:mm:ss’) from dual;//mm會顯示月份

3、例項
日期轉換,獲取系統當前時間
(1)在Java中的語句:
select to_char(sysdate,’yyyy-MM-dd HH24:mm:ss’)from dual;
輸出:2018-05-17 10:05:02
而系統真正的當前時間是2018-05-17 10:54:21,年月日倒是對的,從分鐘上出現了偏差。

(2)但是在oracle資料庫中,這個mm是取不到當前的分鐘數的:
select to_char(sysdate,’yyyy-MM-dd HH24:mi:ss’)from dual; 採用24小時制
輸出:2018-05-17 10:54:21
這行僅僅只有一個字母區別的程式碼,出來的資料有如下的巨大區別。由於這個錯誤顯示的結果極難發現,因為從資料上,幾乎看不錯差異,但是如果關係到賬務的專案,這是一個致命的錯誤。
原因是SQL中不區分大小寫,MM和mm被認為是相同的格式程式碼,所以Oracle的SQL採用了mi代替分鐘。而正因為mm不區分大小寫,所以mm會顯示月份,顯示05,mi顯示分鐘,顯示54。

(3)select to_char(sysdate,’yyyy-MM-dd HH:mi:ss’)from dual; 採用12小時制
2018-05-17 10:54:21

(4)select to_date(‘2018-05-17 10:54:21’,’yyyy-MM-dd HH24:mi:ss’) from dual;
17-5月 -18

(5)select to_char(sysdate,’Day, HH12:MI:SS’) from dual;
星期四, 11:11:26

select to_char(sysdate,’Day, yyyy-MM-dd HH:mi:ss’) from dual;
星期四, 2018-05-17 11:12:26

select to_char(sysdate,’yyyy-MM-dd Day HH:mi:ss’) from dual;
2018-05-17 星期四 11:13:20

4、oracle中的to_date引數含義
(1)日期格式引數含義說明
D 一週中的星期幾
DAY 天的名字,使用空格填充到9個字元
DD 月中的第幾天
DDD 年中的第幾天
DY 天的簡寫名
IW ISO標準的年中的第幾周
IYYY ISO標準的四位年份
YYYY 四位年份
YYY,YY,Y 年份的最後三位,兩位,一位
HH 小時,按12小時計
HH24 小時,按24小時計
MI 分
SS 秒
MM 月
Mon 月份的簡寫
Month 月份的全名
W 該月的第幾個星期
WW 年中的第幾個星期

(2)日期時間間隔操作
當前時間減去7分鐘的時間
select sysdate,sysdate - interval ’7’ MINUTE from dual
當前時間減去7小時的時間
select sysdate - interval ’7’ hour from dual
當前時間減去7天的時間
select sysdate - interval ’7’ day from dual
當前時間減去7月的時間
select sysdate,sysdate - interval ’7’ month from dual
當前時間減去7年的時間
select sysdate,sysdate - interval ’7’ year from dual
時間間隔乘以一個數字
select sysdate,sysdate - 8 *interval ’2’ hour from dual

(3)日期到字元操作
select sysdate,to_char(sysdate,’yyyy-mm-dd hh24:mi:ss’) from dual
select sysdate,to_char(sysdate,’yyyy-mm-dd hh:mi:ss’) from dual
select sysdate,to_char(sysdate,’yyyy-ddd hh:mi:ss’) from dual
select sysdate,to_char(sysdate,’yyyy-mm iw-d hh:mi:ss’) from dual
參考oracle的相關關文件(ORACLE901DOC/SERVER.901/A90125/SQL_ELEMENTS4.HTM#48515)

(4)字元到日期操作
select to_date(’2003-10-17 21:15:37’,’yyyy-mm-dd hh24:mi:ss’) from dual
具體用法和上面的to_char差不多。

(5)trunk/ ROUND函式的使用
select trunc(sysdate ,’YEAR’) from dual
select trunc(sysdate ) from dual
select to_char(trunc(sysdate ,’YYYY’),’YYYY’) from dual

(6)oracle有毫秒級的資料型別
–返回當前時間 年月日小時分秒毫秒
select to_char(current_timestamp(5),’DD-MON-YYYY HH24:MI:SSxFF’) from dual;
–返回當前時間的秒毫秒,可以指定秒後面的精度(最大=9)
select to_char(current_timestamp(9),’MI:SSxFF’) from dual;
參考:https://www.cnblogs.com/fmxyw/archive/2008/08/26/1276850.html

二、Oracle中的to_char()函式
(1)用作日期轉換:
to_char(date,’格式’);
select to_date(‘2005-01-01 ‘,’yyyy-MM-dd’) from dual;
select to_char(sysdate,’yyyy-MM-dd HH24:mi:ss’) from dual;

(2)處理數字:
to_char(number,’格式’);
select to_char(88877) from dual;
select to_char(1234567890,’099999999999999’) from dual;
select to_char(12345678,’999,999,999,999’) from dual;
select to_char(123456,’99.999’) from dual;
select to_char(1234567890,’999,999,999,999.9999’) from dual;

(3)to_char(salary,’99,99);selectTOCHAR(123,99,999.9’) from dual;

(4)用於進位制轉換:將10進位制轉換為16進位制;
select to_char(4567,’xxxx’) from dual;
select to_char(123,’xxx’) from dual;

例子:
to_char() 例子
輸入 輸出
to_char(-0.1,’99.99’) ’ -.10’
to_char(-0.1,’FM9.99’) ‘-.1’
to_char(0.1,’0.9’) ’ 0.1’
to_char(12,’9990999.9’) ’ 0012.0’
to_char(12,’FM9990999.9’) ‘0012’
to_char(485,’999’) ’ 485’
to_char(-485,’999’) ‘-485’
to_char(485,’9 9 9’) ’ 4 8 5’
to_char(1485,’9,999’) ’ 1,485’
to_char(1485,’9G999’) ’ 1 485’
to_char(148.5,’999.999’) ’ 148.500’
to_char(148.5,’999D999’) ’ 148,500’
to_char(3148.5,’9G999D999’) ’ 3 148,500’
to_char(-485,’999S’) ‘485-’
to_char(-485,’999MI’) ‘485-’
to_char(485,’999MI’) ‘485’
to_char(485,’PL999’) ‘+485’
to_char(485,’SG999’) ‘+485’
to_char(-485,’SG999’) ‘-485’
to_char(-485,’9SG99’) ‘4-85’
to_char(-485,’999PR’) ‘<485>’
to_char(485,’L999’) ‘DM 485
to_char(485,’RN’) ’ CDLXXXV’
to_char(485,’FMRN’) ‘CDLXXXV’
to_char(5.2,’FMRN’) V
to_char(482,’999th’) ’ 482nd’
to_char(485, ‘“Good number:”999’) ‘Good number: 485’
to_char(485.8,‘“Pre-decimal:”999” Post-decimal:” .999’) ‘Pre-decimal: 485 Post-decimal: .800’
to_char(12,’99V999’) ’ 12000’
to_char(12.4,’99V999’) ’ 12400’
to_char(12.45, ‘99V9’) ’ 125’
參考:https://www.cnblogs.com/herizai/p/7059124.html

三、Oracle中的to_number()函式
(1)將char或varchar2型別的string轉換為一個number型別的數值:
需要注意的是,被轉換的字串必須符合數值型別格式,如果被轉換的字串不符合數值型格式,Oracle將丟擲錯誤提示;

(2)to_number和to_char恰好是兩個相反的函式;
to_number(varchar2 or char,’格式’)
select to_number(‘000012134’) from dual;
select to_number(‘88877’) from dual;

(3)如果數字在格式範圍內的話,就是正確的,否則就是錯誤的;如:
select to_number(‘12345.678,999999.99’) from dual;
select to_number(‘12345.678,999999.999’) from dual;

(4)可以用來實現進位制轉換;16進位制轉換為10進位制:
select to_number(‘19f’,’xxx’) from dual;
select to_number(‘f’,’xx’) from dual;
參考:https://blog.csdn.net/jiangnan2014/article/details/16921985