程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> Oracle中TO_DATE TO_CHAR格式,to_dateto_char

Oracle中TO_DATE TO_CHAR格式,to_dateto_char

編輯:Oracle教程

Oracle中TO_DATE TO_CHAR格式,to_dateto_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;

    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 與最後一行是一樣的

   可以建立一個函數來處理這個問題

   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;

 

轉:https://www.douban.com/note/31849478/

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved