to_date to_char 的用法及區別

TO_CHAR 是把日期或數字轉換爲字符串
TO_DATE 是把字符串轉換爲數據庫中得日期類型轉換函數
TO_NUMBER 將字符轉化爲數字

TO_CHAR 使用TO_CHAR函數處理數字 
TO_CHAR(number, '格式') 
TO_CHAR(salary,’$99,999.99’); 
使用TO_CHAR函數處理日期 
TO_CHAR(date,’格式’);

 TO_NUMBER 
使用TO_NUMBER函數將字符轉換爲數字 
TO_NUMBER(char[, '格式'])

TO_DATE 使用TO_DATE函數將字符轉換爲日期 
TO_DATE(char[, '格式'])

數字格式格式 
9 代表一個數字 
0 強制顯示0 
$ 放置一個$符 
L 放置一個浮動本地貨幣符 
. 顯示小數點 
, 顯示千位指示符

 日期格式 
格式控制 描述 
YYYY、YYY、YY 分別代表4位、3位、2位的數字年 
YEAR 年的拼寫 
MM 數字月 
MONTH 月的全拼 
MON 月的縮寫 
DD 數字日 
DAY 星期的全拼 
DY 星期的縮寫 
AM 表示上午或者下午 
HH24、HH12 12小時制或24小時制 
MI 分鐘 
SS 秒鐘 
SP 數字的拼寫 
TH 數字的序數詞

“特殊字符” 假如特殊字符 
HH24:MI:SS AM 15:43:20 PM

日期例子:
SELECT TO_DATE('2006-05-01 19:25:34', 'YYYY-MM-DD HH24:MI:SS') FROM DUAL
SELECT TO_DATE('2006-05-01 19:25', 'YYYY-MM-DD HH24:MI') FROM DUAL
SELECT TO_DATE('2006-05-01 19', 'YYYY-MM-DD HH24') FROM DUAL
SELECT TO_DATE('2006-05-01', 'YYYY-MM-DD') FROM DUAL
SELECT TO_DATE('2006-05', 'YYYY-MM') FROM DUAL
SELECT TO_DATE('2006', 'YYYY') FROM DUAL

日期說明:
當省略HH、MI和SS對應的輸入參數時,Oracle使用0作爲DEFAULT值。如果輸入的日期數據忽略時間部分,Oracle會將時、分、秒部分都置爲0,也就是說會取整到日。

同樣,忽略了DD參數,Oracle會採用1作爲日的默認值,也就是說會取整到月。

但是,不要被這種“慣性”所迷惑,如果忽略MM參數,Oracle並不會取整到年,取整到當前月。

注意:
1.在使用Oracle的to_date函數來做日期轉換時,可能會直覺地採用“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會顯示月份


TO_DATE格式(以時間:2007-11-02 13:45:25爲例)

Year: 
yy two digits 兩位年 顯示值:07
yyy three digits 三位年 顯示值:007
yyyy four digits 四位年 顯示值:2007

Month: 
mm number 兩位月 顯示值:11
mon abbreviated 字符集表示 顯示值:11月,若是英文版,顯示nov 
month spelled out 字符集表示 顯示值:11月,若是英文版,顯示november 

Day: 
dd number 當月第幾天 顯示值:02
ddd number 當年第幾天 顯示值:02
dy abbreviated 當週第幾天簡寫 顯示值:星期五,若是英文版,顯示fri
day spelled out 當週第幾天全寫 顯示值:星期五,若是英文版,顯示friday 
ddspth spelled out, ordinal twelfth 

Hour:
hh two digits 12小時進制 顯示值:01
hh24 two digits 24小時進制 顯示值:13

Minute:
mi two digits 60進制 顯示值:45

Second:
ss two digits 60進制 顯示值:25

其它
Q digit 季度 顯示值:4
WW digit 當年第幾周 顯示值:44
W digit 當月第幾周 顯示值:1

24小時格式下時間範圍爲: 0:00:00 - 23:59:59.... 
12小時格式下時間範圍爲: 1:00:00 - 12:59:59 .... 

1. 日期和字符轉換函數用法(to_date,to_char)

select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') as nowTime from dual; //日期轉化爲字符串 
select to_char(sysdate,'yyyy') as nowYear from dual; //獲取時間的年 
select to_char(sysdate,'mm') as nowMonth from dual; //獲取時間的月 
select to_char(sysdate,'dd') as nowDay from dual; //獲取時間的日 
select to_char(sysdate,'hh24') as nowHour from dual; //獲取時間的時 
select to_char(sysdate,'mi') as nowMinute from dual; //獲取時間的分 
select to_char(sysdate,'ss') as nowSecond from dual; //獲取時間的秒 

select to_date('2004-05-07 13:23:44','yyyy-mm-dd hh24:mi:ss') from dual//

2. 
select to_char( to_date(222,'J'),'Jsp') from dual 

顯示Two Hundred Twenty-Two

3.求某天是星期幾 
select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day') from dual; 
星期一 
select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual;
monday 
設置日期語言 
ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN'; 
也可以這樣 
TO_DATE ('2002-08-26', 'YYYY-mm-dd', 'NLS_DATE_LANGUAGE = American')

4. 兩個日期間的天數 
select floor(sysdate - to_date('20020405','yyyymmdd')) from dual;

5. 時間爲null的用法 
select id, active_date from table1 
UNION 
select 1, TO_DATE(null) from dual; 

注意要用TO_DATE(null)

6.月份差 
a_date between to_date('20011201','yyyymmdd') and to_date('20011231','yyyymmdd') 
那麼12月31號中午12點之後和12月1號的12點之前是不包含在這個範圍之內的。 
所以,當時間需要精確的時候,覺得to_char還是必要的 

7. 日期格式衝突問題 
輸入的格式要看你安裝的ORACLE字符集的類型, 比如: US7ASCII, date格式的類型就是: '01-Jan-01' 
alter system set NLS_DATE_LANGUAGE = American 
alter session set NLS_DATE_LANGUAGE = American 
或者在to_date中寫 
select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual;
注意我這只是舉了NLS_DATE_LANGUAGE,當然還有很多, 
可查看 
select * from nls_session_parameters 
select * from V$NLS_PARAMETERS

8. 
select count(*) 
from ( select rownum-1 rnum 
from all_objects 
where rownum <= to_date('2002-02-28','yyyy-mm-dd') - to_date('2002- 
02-01','yyyy-mm-dd')+1 

where to_char( to_date('2002-02-01','yyyy-mm-dd')+rnum-1, 'D' ) 
not in ( '1', '7' ) 

查找2002-02-28至2002-02-01間除星期一和七的天數 
在前後分別調用DBMS_UTILITY.GET_TIME, 讓後將結果相減(得到的是1/100秒, 而不是毫秒).

9. 查找月份 
select months_between(to_date('01-31-1999','MM-DD-YYYY'),to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;

select months_between(to_date('02-01-1999','MM-DD-YYYY'),to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;
1.03225806451613 

10. Next_day的用法 
Next_day(date, day) 

Monday-Sunday, for format code DAY 
Mon-Sun, for format code DY 
1-7, for format code D

11 
select to_char(sysdate,'hh:mi:ss') TIME from all_objects 
注意:第一條記錄的TIME 與最後一行是一樣的 
可以建立一個函數來處理這個問題 
create or replace function sys_date return date is 
begin 
return sysdate; 
end; 

select to_char(sys_date,'hh:mi:ss') from all_objects; 

12.獲得小時數 
extract()找出日期或間隔值的字段值
SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 2:38:40') from offer 
SQL> select sysdate ,to_char(sysdate,'hh') from dual; 

SYSDATE TO_CHAR(SYSDATE,'HH') 
-------------------- --------------------- 
2003-10-13 19:35:21 07 

SQL> select sysdate ,to_char(sysdate,'hh24') from dual; 

SYSDATE TO_CHAR(SYSDATE,'HH24') 
-------------------- ----------------------- 
2003-10-13 19:35:21 19


13.年月日的處理 
select older_date, 
newer_date, 
years, 
months, 
abs( 
trunc( 
newer_date- 
add_months( older_date,years*12+months ) 

) days 

from ( select 
trunc(months_between( newer_date, older_date )/12) YEARS, 
mod(trunc(months_between( newer_date, older_date )),12 ) MONTHS, 
newer_date, 
older_date 
from ( 
select hiredate older_date, add_months(hiredate,rownum)+rownum newer_date 
from emp 

)

14.處理月份天數不定的辦法 
select to_char(add_months(last_day(sysdate) +1, -2), 'yyyymmdd'),last_day(sysdate) from dual

16.找出今年的天數 
select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual

閏年的處理方法 
to_char( last_day( to_date('02' | | :year,'mmyyyy') ), 'dd' ) 
如果是28就不是閏年

17.yyyy與rrrr的區別 
'YYYY99 TO_C 
------- ---- 
yyyy 99 0099 
rrrr 99 1999 
yyyy 01 0001 
rrrr 01 2001

18.不同時區的處理 
select to_char( NEW_TIME( sysdate, 'GMT','EST'), 'dd/mm/yyyy hh:mi:ss') ,sysdate 
from dual;

19.5秒鐘一個間隔 
Select TO_DATE(FLOOR(TO_CHAR(sysdate,'SSSSS')/300) * 300,'SSSSS') ,TO_CHAR(sysdate,'SSSSS')
from dual

2002-11-1 9:55:00 35786 
SSSSS表示5位秒數

20.一年的第幾天 
select TO_CHAR(SYSDATE,'DDD'),sysdate from dual

310 2002-11-6 10:03:51

21.計算小時,分,秒,毫秒 
select 
Days, 
A, 
TRUNC(A*24) Hours, 
TRUNC(A*24*60 - 60*TRUNC(A*24)) Minutes, 
TRUNC(A*24*60*60 - 60*TRUNC(A*24*60)) Seconds, 
TRUNC(A*24*60*60*100 - 100*TRUNC(A*24*60*60)) mSeconds 
from 

select 
trunc(sysdate) Days, 
sysdate - trunc(sysdate) A 
from dual 
)


select * from tabname 
order by decode(mode,'FIFO',1,-1)*to_char(rq,'yyyymmddhh24miss'); 

// 
floor((date2-date1) /365) 作爲年 
floor((date2-date1, 365) /30) 作爲月 
d(mod(date2-date1, 365), 30)作爲日.

23.next_day函數 返回下個星期的日期,day爲1-7或星期日-星期六,1表示星期日
next_day(sysdate,6)是從當前開始下一個星期五。後面的數字是從星期日開始算起。 
1 2 3 4 5 6 7 
日 一 二 三 四 五 六 

--------------------------------------------------------------- 

select (sysdate-to_date('2003-12-03 12:55:45','yyyy-mm-dd hh24:mi:ss'))*24*60*60 from ddual
日期 返回的是天 然後 轉換爲ss

24,round[舍入到最接近的日期](day:舍入到最接近的星期日)
select sysdate S1,
round(sysdate) S2 ,
round(sysdate,'year') YEAR,
round(sysdate,'month') MONTH ,
round(sysdate,'day') DAY from dual

25,trunc[截斷到最接近的日期,單位爲天] ,返回的是日期類型
select sysdate S1, 
trunc(sysdate) S2, //返回當前日期,無時分秒
trunc(sysdate,'year') YEAR, //返回當前年的1月1日,無時分秒
trunc(sysdate,'month') MONTH , //返回當前月的1日,無時分秒
trunc(sysdate,'day') DAY //返回當前星期的星期天,無時分秒
from dual

26,返回日期列表中最晚日期
select greatest('01-1月-04','04-1月-04','10-2月-04') from dual

27.計算時間差
注:oracle時間差是以天數爲單位,所以換算成年月,日

select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))/365) as spanYears from dual

//時間差-年
select ceil(moths_between(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))) as spanMonths from dual

//時間差-月
select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))) as spanDays from dual

//時間差-天
select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))*24) as spanHours from dual

//時間差-時
select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))*24*60) as spanMinutes from dual

//時間差-分
select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))*24*60*60) as spanSeconds from dual

//時間差-秒

28.更新時間
注:oracle時間加減是以天數爲單位,設改變量爲n,所以換算成年月,日
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n*365,'yyyy-mm-dd hh24:mi:ss') as newTime from dual

//改變時間-年
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),add_months(sysdate,n) as newTime from dual

//改變時間-月
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n,'yyyy-mm-dd hh24:mi:ss') as newTime from dual

//改變時間-日
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n/24,'yyyy-mm-dd hh24:mi:ss') as newTime from dual

//改變時間-時
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n/24/60,'yyyy-mm-dd hh24:mi:ss') as newTime from dual

//改變時間-分
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n/24/60/60,'yyyy-mm-dd hh24:mi:ss') as newTime from dual

//改變時間-秒

29.查找月的第一天,最後一天
SELECT Trunc(Trunc(SYSDATE, 'MONTH') - 1, 'MONTH') First_Day_Last_Month,
Trunc(SYSDATE, 'MONTH') - 1 / 86400 Last_Day_Last_Month,
Trunc(SYSDATE, 'MONTH') First_Day_Cur_Month,
LAST_DAY(Trunc(SYSDATE, 'MONTH')) + 1 - 1 / 86400 Last_Day_Cur_Month
FROM dual;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章