to_date("要轉(zhuǎn)換的字符串","轉(zhuǎn)換的格式") 兩個(gè)參數(shù)的格式必須匹配,否則會(huì)報(bào)錯(cuò)。
即按照第二個(gè)參數(shù)的格式解釋第一個(gè)參數(shù)。
to_char(日期,"轉(zhuǎn)換格式" ) 即把給定的日期按照“轉(zhuǎn)換格式”轉(zhuǎn)換。
轉(zhuǎn)換的格式:
表示year的:y 表示年的最后一位 yy 表示年的最后2位 yyy 表示年的最后3位 yyyy 用4位數(shù)表示年
表示month的:mm 用2位數(shù)字表示月;mon 用簡(jiǎn)寫形式 比如11月或者nov ;month 用全稱 比如11月或者november
表示day的:dd 表示當(dāng)月第幾天;ddd表示當(dāng)年第幾天;dy 當(dāng)周第幾天 簡(jiǎn)寫 比如星期五或者fri;day當(dāng)周第幾天 全寫
比如星期五或者friday。
表示hour的:hh 2位數(shù)表示小時(shí) 12進(jìn)制; hh24 2位數(shù)表示小時(shí) 24小時(shí)
表示minute的:mi 2位數(shù)表示分鐘
表示second的:ss 2位數(shù)表示秒 60進(jìn)制
表示季度的:q 一位數(shù) 表示季度 (1-4)
另外還有ww 用來(lái)表示當(dāng)年第幾周 w用來(lái)表示當(dāng)月第幾周。
24小時(shí)制下的時(shí)間范圍:00:00:00-23:59:59
12小時(shí)制下的時(shí)間范圍:1:00:00-12:59:59
比如:
1
2
3
|
select to_char(sysdate, 'yy-mm-dd hh24:mi:ss' ) from dual //顯示:08-11-07 13:22:42 select to_date( '2005-12-25,13:25:59' , 'yyyy-mm-dd,hh24:mi:ss' ) from dual //顯示:2005-12-25 13:25:59 |
而如果把上式寫作:select to_date('2005-12-25,13:25:59','yyyy-mm-dd,hh:mi:ss') from dual,則會(huì)報(bào)錯(cuò),因?yàn)樾r(shí)hh是12進(jìn)制,13為非法輸入,不能匹配。
補(bǔ)充:
當(dāng)前時(shí)間減去7分鐘的時(shí)間
1
|
select sysdate,sysdate - interval '7' MINUTE from dual |
當(dāng)前時(shí)間減去7小時(shí)的時(shí)間
1
|
select sysdate - interval '7' hour from dual |
當(dāng)前時(shí)間減去7天的時(shí)間
1
|
select sysdate - interval '7' day from dual |
當(dāng)前時(shí)間減去7月的時(shí)間
1
|
select sysdate,sysdate - interval '7' month from dual |
當(dāng)前時(shí)間減去7年的時(shí)間
1
|
select sysdate,sysdate - interval '7' year from dual |
時(shí)間間隔乘以一個(gè)數(shù)字
1
|
select sysdate,sysdate - 8*interval '7' hour from dual |
Dual偽列
含義解釋:
Dual 是 Oracle中的一個(gè)實(shí)際存在的表,任何用戶均可讀取,常用在沒(méi)有目標(biāo)表的select語(yǔ)句塊中。
比如,我要獲得系統(tǒng)時(shí)間,則用“select sysdate from dual” 則返回系統(tǒng)當(dāng)前的時(shí)間:2008-11-07 9:32:49,不同系統(tǒng)可能返回日期的格式不一樣。"select user from dual"則返回當(dāng)前連接的用戶。如果是"select 1+2 from dual",則返回結(jié)果:3
TO_DATE格式(以時(shí)間: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 當(dāng)月第幾天 顯示值:02
ddd number 當(dāng)年第幾天 顯示值:02
dy abbreviated 當(dāng)周第幾天簡(jiǎn)寫 顯示值:星期五,若是英文版,顯示fri
day spelled out 當(dāng)周第幾天全寫 顯示值:星期五,若是英文版,顯示friday
ddspth spelled out, ordinal twelfth
Hour:
hh two digits 12小時(shí)進(jìn)制 顯示值:01
hh24 two digits 24小時(shí)進(jìn)制 顯示值:13
Minute:
mi two digits 60進(jìn)制 顯示值:45
Second:
ss two digits 60進(jìn)制 顯示值:25
其它
Q digit 季度 顯示值:4
WW digit 當(dāng)年第幾周 顯示值:44
W digit 當(dāng)月第幾周 顯示值:1
24小時(shí)格式下時(shí)間范圍為: 0:00:00 - 23:59:59....
12小時(shí)格式下時(shí)間范圍為: 1:00:00 - 12:59:59 ....
1. 日期和字符轉(zhuǎn)換函數(shù)用法(to_date,to_char)
1
2
3
4
5
6
7
8
9
|
select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss' ) as nowTime from dual; //日期轉(zhuǎn)化為字符串 select to_char(sysdate, 'yyyy' ) as nowYear from dual; //獲取時(shí)間的年 select to_char(sysdate, 'mm' ) as nowMonth from dual; //獲取時(shí)間的月 select to_char(sysdate, 'dd' ) as nowDay from dual; //獲取時(shí)間的日 select to_char(sysdate, 'hh24' ) as nowHour from dual; //獲取時(shí)間的時(shí) select to_char(sysdate, 'mi' ) as nowMinute from dual; //獲取時(shí)間的分 select to_char(sysdate, 'ss' ) as nowSecond from dual; //獲取時(shí)間的秒 select to_date( '2004-05-07 13:23:44' , 'yyyy-mm-dd hh24:mi:ss' ) from dual// |
2.
1
|
select to_char( to_date(222, 'J' ), 'Jsp' ) from dual |
顯示Two Hundred Twenty-Two
3.求某天是星期幾
1
|
select to_char(to_date( '2002-08-26' , 'yyyy-mm-dd' ), 'day' ) from dual; |
星期一
1
|
select to_char(to_date( '2002-08-26' , 'yyyy-mm-dd' ), 'day' , 'NLS_DATE_LANGUAGE = American' ) from dual; |
設(shè)置日期語(yǔ)言
1
|
ALTER SESSION SET NLS_DATE_LANGUAGE= 'AMERICAN' ; |
也可以這樣
1
|
TO_DATE ( '2002-08-26' , 'YYYY-mm-dd' , 'NLS_DATE_LANGUAGE = American' ) |
4. 兩個(gè)日期間的天數(shù)
1
|
select floor(sysdate - to_date( '20020405' , 'yyyymmdd' )) from dual; |
5. 時(shí)間為null的用法
1
2
3
|
select id, active_date from table1 UNION select 1, TO_DATE( null ) from dual; |
注意要用TO_DATE(null)
6.月份差
1
|
a_date between to_date( '20011201' , 'yyyymmdd' ) and to_date( '20011231' , 'yyyymmdd' ) |
那么12月31號(hào)中午12點(diǎn)之后和12月1號(hào)的12點(diǎn)之前是不包含在這個(gè)范圍之內(nèi)的。
所以,當(dāng)時(shí)間需要精確的時(shí)候,覺(jué)得to_char還是必要的
7. 日期格式?jīng)_突問(wèn)題
輸入的格式要看你安裝的ORACLE字符集的類型, 比如: US7ASCII, date格式的類型就是: '01-Jan-01'
1
2
|
alter system set NLS_DATE_LANGUAGE = American alter session set NLS_DATE_LANGUAGE = American |
或者在to_date中寫
1
|
select to_char(to_date( '2002-08-26' , 'yyyy-mm-dd' ), 'day' , 'NLS_DATE_LANGUAGE = American' ) from dual; |
注意我這只是舉了NLS_DATE_LANGUAGE,當(dāng)然還有很多,
可查看
1
2
|
select * from nls_session_parameters select * from V$NLS_PARAMETERS |
8. 查找2002-02-28至2002-02-01間除星期一和七的天數(shù)
在前后分別調(diào)用DBMS_UTILITY.GET_TIME, 讓后將結(jié)果相減(得到的是1/100秒, 而不是毫秒).
1
2
3
4
5
6
7
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' ) |
9. 查找月份
1
2
|
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的用法
1
|
Next_day( date , day ) |
Monday-Sunday, for format code DAY
Mon-Sun, for format code DY
1-7, for format code D
11
1
|
select to_char(sysdate, 'hh:mi:ss' ) TIME from all_objects |
注意:第一條記錄的TIME 與最后一行是一樣的
可以建立一個(gè)函數(shù)來(lái)處理這個(gè)問(wèn)題
1
2
3
4
5
6
|
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.獲得小時(shí)數(shù)
extract()找出日期或間隔值的字段值
1
2
3
4
5
6
7
8
9
10
11
12
|
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.年月日的處理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
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.處理月份天數(shù)不定的辦法
1
|
select to_char(add_months(last_day(sysdate) +1, -2), 'yyyymmdd' ),last_day(sysdate) from dual |
16.找出今年的天數(shù)
1
|
select add_months(trunc(sysdate, 'year' ), 12) - trunc(sysdate, 'year' ) from dual |
閏年的處理方法
1
|
to_char( last_day( to_date( '02' | | : year , 'mmyyyy' ) ), 'dd' ) |
如果是28就不是閏年
17.yyyy與rrrr的區(qū)別
1
2
3
4
5
6
|
'YYYY99 TO_C ------- ---- yyyy 99 0099 rrrr 99 1999 yyyy 01 0001 rrrr 01 2001 |
18.不同時(shí)區(qū)的處理
1
|
select to_char( NEW_TIME( sysdate, 'GMT' , 'EST' ), 'dd/mm/yyyy hh:mi:ss' ) ,sysdate from dual; |
19.5秒鐘一個(gè)間隔
1
|
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位秒數(shù)
20.一年的第幾天
1
|
select TO_CHAR(SYSDATE, 'DDD' ),sysdate from dual |
310 2002-11-6 10:03:51
21.計(jì)算小時(shí),分,秒,毫秒
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
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函數(shù) 返回下個(gè)星期的日期,day為1-7或星期日-星期六,1表示星期日
next_day(sysdate,6)是從當(dāng)前開(kāi)始下一個(gè)星期五。后面的數(shù)字是從星期日開(kāi)始算起。
1 2 3 4 5 6 7
日 一 二 三 四 五 六
1
|
select (sysdate-to_date( '2003-12-03 12:55:45' , 'yyyy-mm-dd hh24:mi:ss' ))*24*60*60 from ddual |
日期 返回的是天 然后 轉(zhuǎn)換為ss
24,round[舍入到最接近的日期](day:舍入到最接近的星期日)
1
2
3
4
5
|
select sysdate S1, round(sysdate) S2 , round(sysdate, 'year' ) YEAR , round(sysdate, 'month' ) MONTH , round(sysdate, 'day' ) DAY from dual |
25,trunc[截?cái)嗟阶罱咏娜掌?單位為天] ,返回的是日期類型
1
2
3
4
5
6
|
select sysdate S1, trunc(sysdate) S2, //返回當(dāng)前日期,無(wú)時(shí)分秒 trunc(sysdate, 'year' ) YEAR , //返回當(dāng)前年的1月1日,無(wú)時(shí)分秒 trunc(sysdate, 'month' ) MONTH , //返回當(dāng)前月的1日,無(wú)時(shí)分秒 trunc(sysdate, 'day' ) DAY //返回當(dāng)前星期的星期天,無(wú)時(shí)分秒 from dual |
26,返回日期列表中最晚日期
1
|
select greatest( '01-1月-04' , '04-1月-04' , '10-2月-04' ) from dual |
27.計(jì)算時(shí)間差
注:oracle時(shí)間差是以天數(shù)為單位,所以換算成年月,日
1
2
3
4
5
6
|
select floor(to_number(sysdate-to_date( '2007-11-02 15:55:03' , 'yyyy-mm-dd hh24:mi:ss' ))/365) as spanYears from dual //時(shí)間差-年 select ceil(moths_between(sysdate-to_date( '2007-11-02 15:55:03' , 'yyyy-mm-dd hh24:mi:ss' ))) as spanMonths from dual //時(shí)間差-月 select floor(to_number(sysdate-to_date( '2007-11-02 15:55:03' , 'yyyy-mm-dd hh24:mi:ss' ))) as spanDays from dual //時(shí)間差-天 select floor(to_number(sysdate-to_date( '2007-11-02 15:55:03' , 'yyyy-mm-dd hh24:mi:ss' ))*24) as spanHours from dual //時(shí)間差-時(shí) 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 //時(shí)間差-分 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 //時(shí)間差-秒 |
28.更新時(shí)間
注:oracle時(shí)間加減是以天數(shù)為單位,設(shè)改變量為n,所以換算成年月,日
1
2
3
4
5
6
|
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 //改變時(shí)間-年 select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss' ),add_months(sysdate,n) as newTime from dual //改變時(shí)間-月 select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss' ),to_char(sysdate+n, 'yyyy-mm-dd hh24:mi:ss' ) as newTime from dual //改變時(shí)間-日 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 //改變時(shí)間-時(shí) 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 //改變時(shí)間-分 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 //改變時(shí)間-秒 |
29.查找月的第一天,最后一天
1
2
3
4
5
|
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; |
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。
原文鏈接:http://www.cnblogs.com/xiaobaihome/archive/2012/03/14/2395568.html