Oracle to_char() to_date() to_number()函数
TO_CHAR 是把日期或數(shù)字轉(zhuǎn)換為字符串
TO_DATE 是把字符串轉(zhuǎn)換為數(shù)據(jù)庫中得日期類型轉(zhuǎn)換函數(shù)
TO_NUMBER 將字符轉(zhuǎn)化為數(shù)字
? TO_CHAR
使用TO_CHAR函數(shù)處理數(shù)字
TO_CHAR(number, '格式')
TO_CHAR(salary,’$99,999.99’);
使用TO_CHAR函數(shù)處理日期
TO_CHAR(date,’格式’);
? TO_NUMBER
使用TO_NUMBER函數(shù)將字符轉(zhuǎn)換為數(shù)字
TO_NUMBER(char[, '格式'])
? TO_DATE
使用TO_DATE函數(shù)將字符轉(zhuǎn)換為日期
TO_DATE(char[, '格式'])
? 數(shù)字格式格式
9 代表一個(gè)數(shù)字
0 強(qiáng)制顯示0
$ 放置一個(gè)$符
L 放置一個(gè)浮動(dòng)本地貨幣符
. 顯示小數(shù)點(diǎn)
, 顯示千位指示符
? 日期格式
格式控制 描述
YYYY、YYY、YY 分別代表4位、3位、2位的數(shù)字年
YEAR 年的拼寫
MM 數(shù)字月
MONTH 月的全拼
MON 月的縮寫
DD 數(shù)字日
DAY 星期的全拼
DY 星期的縮寫
AM 表示上午或者下午
HH24、HH12 12小時(shí)制或24小時(shí)制
MI 分鐘
SS 秒鐘
SP 數(shù)字的拼寫
TH 數(shù)字的序數(shù)詞
“特殊字符” 假如特殊字符
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
日期說明:
當(dāng)省略HH、MI和SS對(duì)應(yīng)的輸入?yún)?shù)時(shí),Oracle使用0作為DEFAULT值。如果輸入的日期數(shù)據(jù)忽略時(shí)間部分,Oracle會(huì)將時(shí)、分、秒部分都置為0,也就是說會(huì)取整到日。
同樣,忽略了DD參數(shù),Oracle會(huì)采用1作為日的默認(rèn)值,也就是說會(huì)取整到月。
但是,不要被這種“慣性”所迷惑,如果忽略MM參數(shù),Oracle并不會(huì)取整到年,取整到當(dāng)前月。
注意:
1.在使用Oracle的to_date函數(shù)來做日期轉(zhuǎn)換時(shí),可能會(huì)直覺地采用“yyyy-MM-dd HH:mm:ss”的格式作為格式進(jìn)行轉(zhuǎn)換,但是在Oracle中會(huì)引起錯(cuò)誤:“ORA 01810 格式代碼出現(xiàn)兩次”。如:select to_date('2005-01-01 13:14:20','yyyy-MM-dd HH24:mm:ss') from dual;原因是SQL中不區(qū)分大小寫,MM和mm被認(rèn)為是相同的格式代碼,所以O(shè)racle的SQL采用了mi代替分鐘。select to_date('2005-01-01 13:14:20','yyyy-MM-dd HH24:mi:ss') from dual;
2.另要以24小時(shí)的形式顯示出來要用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會(huì)顯示月份
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)
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. ? ? ?
? ?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 ? ? ?
? 設(shè)置日期語言 ? ? ?
? ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN'; ? ? ?
? 也可以這樣 ? ? ?
? TO_DATE ('2002-08-26', 'YYYY-mm-dd', 'NLS_DATE_LANGUAGE = American') ? ?
4. 兩個(gè)日期間的天數(shù) ? ? ?
? ?select floor(sysdate - to_date('20020405','yyyymmdd')) from dual; ? ?
5. 時(shí)間為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號(hào)中午12點(diǎn)之后和12月1號(hào)的12點(diǎn)之前是不包含在這個(gè)范圍之內(nèi)的。 ? ? ?
? 所以,當(dāng)時(shí)間需要精確的時(shí)候,覺得to_char還是必要的
7. 日期格式?jīng)_突問題 ? ? ?
? ?輸入的格式要看你安裝的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,當(dāng)然還有很多, ? ? ?
? ?可查看 ? ? ?
? ?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間除星期一和七的天數(shù) ? ? ?
? 在前后分別調(diào)用DBMS_UTILITY.GET_TIME, 讓后將結(jié)果相減(得到的是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; ? ? ?
? ?1 ? ? ?
? 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 與最后一行是一樣的 ? ? ?
? 可以建立一個(gè)函數(shù)來處理這個(gè)問題 ? ? ?
? 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()找出日期或間隔值的字段值
? ?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.處理月份天數(shù)不定的辦法 ? ? ?
? select to_char(add_months(last_day(sysdate) +1, -2), 'yyyymmdd'),last_day(sysdate) from dual ? ?
16.找出今年的天數(shù) ? ? ?
? 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的區(qū)別 ? ? ?
? 'YYYY99 TO_C ? ? ?
? ------- ---- ? ? ?
? yyyy 99 0099 ? ? ?
? rrrr 99 1999 ? ? ?
? yyyy 01 0001 ? ? ?
? rrrr 01 2001 ? ?
18.不同時(shí)區(qū)的處理 ? ? ?
? select to_char( NEW_TIME( sysdate, 'GMT','EST'), 'dd/mm/yyyy hh:mi:ss') ,sysdate ? ? ?
? from dual; ? ?
19.5秒鐘一個(gè)間隔 ? ? ?
? 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.一年的第幾天 ? ? ?
? select TO_CHAR(SYSDATE,'DDD'),sysdate from dual
? 310 2002-11-6 10:03:51 ? ?
21.計(jì)算小時(shí),分,秒,毫秒 ? ? ?
? ?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)前開始下一個(gè)星期五。后面的數(shù)字是從星期日開始算起。 ? ? ?
? 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
? 日期 返回的是天 然后 轉(zhuǎn)換為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[截?cái)嗟阶罱咏娜掌?單位為天] ,返回的是日期類型
? select sysdate S1, ? ? ? ? ? ? ? ? ? ?
? ? trunc(sysdate) S2, ? ? ? ? ? ? ? ? //返回當(dāng)前日期,無時(shí)分秒
? ? trunc(sysdate,'year') YEAR, ? ? ? ?//返回當(dāng)前年的1月1日,無時(shí)分秒
? ? trunc(sysdate,'month') MONTH , ? ? //返回當(dāng)前月的1日,無時(shí)分秒
? ? trunc(sysdate,'day') DAY ? ? ? ? ? //返回當(dāng)前星期的星期天,無時(shí)分秒
? from dual
26,返回日期列表中最晚日期
? select greatest('01-1月-04','04-1月-04','10-2月-04') from dual
27.計(jì)算時(shí)間差
? ? 注:oracle時(shí)間差是以天數(shù)為單位,所以換算成年月,日
? ? ?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,所以換算成年月,日
? ? 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.查找月的第一天,最后一天
? ? 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;
轉(zhuǎn)載自:http://www.douban.com/note/31849478/
轉(zhuǎn)載于:https://blog.51cto.com/bugou/1273086
總結(jié)
以上是生活随笔為你收集整理的Oracle to_char() to_date() to_number()函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PyCharm设置自动换行
- 下一篇: 语音信号预处理1——chirp信号的生成