oracle中關於日期的to_char和to_date

  1. TO_CHAR 是把日期或數字轉換爲字符串  
  2. TO_DATE 是把字符串轉換爲數據庫中得日期類型轉換函數  
  3. TO_NUMBER 將字符轉化爲數字  
  4.   
  5.  TO_CHAR   
  6. 使用TO_CHAR函數處理數字   
  7. TO_CHAR(number, '格式')   
  8. TO_CHAR(salary,’$99,999.99’);   
  9. 使用TO_CHAR函數處理日期   
  10. TO_CHAR(date,’格式’);   
  11.   
  12.  TO_NUMBER   
  13. 使用TO_NUMBER函數將字符轉換爲數字   
  14. TO_NUMBER(char[, '格式'])   
  15.   
  16.  TO_DATE   
  17. 使用TO_DATE函數將字符轉換爲日期   
  18. TO_DATE(char[, '格式'])   
  19.   
  20.  數字格式格式   
  21. 9 表明一個數字   
  22. 0 強制顯示0   
  23. $ 放置一個$符   
  24. L 放置一個浮動本地貨幣符   
  25. . 顯示小數點   
  26. , 顯示千位指示符   
  27.   
  28.  日期格式   
  29. 格式控制 描述   
  30. YYYY、YYY、YY 分別表明4位、3位、2位的數字年   
  31. YEAR 年的拼寫   
  32. MM 數字月   
  33. MONTH 月的全拼   
  34. MON 月的縮寫   
  35. DD 數字日   
  36. DAY 星期的全拼   
  37. DY 星期的縮寫   
  38. AM 表示上午或者下午   
  39. HH2四、HH12 12小時制或24小時制   
  40. MI 分鐘   
  41. SS 秒鐘   
  42. SP 數字的拼寫   
  43. TH 數字的序數詞   
  44.   
  45. 「特殊字符」 假如特殊字符   
  46. HH24:MI:SS AM 15:43:20 PM   
  47.   
  48. 日期例子:  
  49. SELECT TO_DATE('2006-05-01 19:25:34', 'YYYY-MM-DD HH24:MI:SS') FROM DUAL  
  50. SELECT TO_DATE('2006-05-01 19:25', 'YYYY-MM-DD HH24:MI') FROM DUAL  
  51. SELECT TO_DATE('2006-05-01 19', 'YYYY-MM-DD HH24') FROM DUAL  
  52. SELECT TO_DATE('2006-05-01', 'YYYY-MM-DD') FROM DUAL  
  53. SELECT TO_DATE('2006-05', 'YYYY-MM') FROM DUAL  
  54. SELECT TO_DATE('2006', 'YYYY') FROM DUAL  
  55.   
  56. 日期說明:  
  57. 當省略HH、MI和SS對應的輸入參數時,Oracle使用0做爲DEFAULT值。若是輸入的日期數據忽略時間部分,Oracle會將時、分、秒部分都置爲0,也就是說會取整到日。  
  58.   
  59. 一樣,忽略了DD參數,Oracle會採用1做爲日的默認值,也就是說會取整到月。  
  60.   
  61. 可是,不要被這種「慣性」所迷惑,若是忽略MM參數,Oracle並不會取整到年,取整到當前月。  
  62.   
  63. 注意:  
  64. 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;  
  65. 2.另要以24小時的形式顯示出來要用HH24  
  66. select to_char(sysdate,'yyyy-MM-dd HH24:mi:ss') from dual;//mi是分鐘  
  67. select to_char(sysdate,'yyyy-MM-dd HH24:mm:ss') from dual;//mm會顯示月份  
  68.   
  69.   
  70. TO_DATE格式(以時間:2007-11-02   13:45:25爲例)  
  71.      
  72.         Year:        
  73.         yy two digits 兩位年                顯示值:07  
  74.         yyy three digits 三位年                顯示值:007  
  75.         yyyy four digits 四位年                顯示值:2007  
  76.               
  77.         Month:        
  78.         mm    number     兩位月              顯示值:11  
  79.         mon    abbreviated 字符集表示          顯示值:11月,如果英文版,顯示nov       
  80.         month spelled out 字符集表示          顯示值:11月,如果英文版,顯示november   
  81.             
  82.         Day:        
  83.         dd    number         當月第幾天        顯示值:02  
  84.         ddd    number         當年第幾天        顯示值:02  
  85.         dy    abbreviated 當週第幾天簡寫    顯示值:星期五,如果英文版,顯示fri  
  86.         day    spelled out   當週第幾天全寫    顯示值:星期五,如果英文版,顯示friday          
  87.         ddspth spelled out, ordinal twelfth   
  88.                
  89.               Hour:  
  90.               hh    two digits 12小時進制            顯示值:01  
  91.               hh24 two digits 24小時進制            顯示值:13  
  92.                 
  93.               Minute:  
  94.               mi    two digits 60進制                顯示值:45  
  95.                 
  96.               Second:  
  97.               ss    two digits 60進制                顯示值:25  
  98.                 
  99.               其它  
  100.               Q     digit         季度                  顯示值:4  
  101.               WW    digit         當年第幾周            顯示值:44  
  102.               W    digit          當月第幾周            顯示值:1  
  103.                 
  104.         24小時格式下時間範圍爲: 0:00:00 - 23:59:59....        
  105.         12小時格式下時間範圍爲: 1:00:00 - 12:59:59 ....   
  106.               
  107. 1. 日期和字符轉換函數用法(to_date,to_char)  
  108.            
  109. select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') as nowTime from dual;   //日期轉化爲字符串     
  110. select to_char(sysdate,'yyyy') as nowYear   from dual;   //獲取時間的年     
  111. select to_char(sysdate,'mm')    as nowMonth from dual;   //獲取時間的月     
  112. select to_char(sysdate,'dd')    as nowDay    from dual;   //獲取時間的日     
  113. select to_char(sysdate,'hh24') as nowHour   from dual;   //獲取時間的時     
  114. select to_char(sysdate,'mi')    as nowMinute from dual;   //獲取時間的分     
  115. select to_char(sysdate,'ss')    as nowSecond from dual;   //獲取時間的秒   
  116.       
  117. select to_date('2004-05-07 13:23:44','yyyy-mm-dd hh24:mi:ss')    from dual//  
  118.   
  119. 2.        
  120.     select to_char( to_date(222,'J'),'Jsp') from dual        
  121.       
  122.     顯示Two Hundred Twenty-Two       
  123.   
  124. 3.求某天是星期幾        
  125.    select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day') from dual;        
  126.    星期一        
  127.    select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual;        
  128.    monday        
  129.    設置日期語言        
  130.    ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN';        
  131.    也能夠這樣        
  132.    TO_DATE ('2002-08-26', 'YYYY-mm-dd', 'NLS_DATE_LANGUAGE = American')       
  133.   
  134. 4. 兩個日期間的天數        
  135.     select floor(sysdate - to_date('20020405','yyyymmdd')) from dual;       
  136.   
  137. 5. 時間爲null的用法        
  138.    select id, active_date from table1        
  139.    UNION        
  140.    select 1, TO_DATE(null) from dual;        
  141.      
  142.    注意要用TO_DATE(null)       
  143.   
  144. 6.月份差     
  145.    a_date between to_date('20011201','yyyymmdd') and to_date('20011231','yyyymmdd')        
  146.    那麼12月31號中午12點以後和12月1號的12點以前是不包含在這個範圍以內的。        
  147.    因此,當時間須要精確的時候,以爲to_char仍是必要的   
  148.         
  149. 7. 日期格式衝突問題        
  150.     輸入的格式要看你安裝的ORACLE字符集的類型, 好比: US7ASCII, date格式的類型就是: '01-Jan-01'        
  151.     alter system set NLS_DATE_LANGUAGE = American        
  152.     alter session set NLS_DATE_LANGUAGE = American        
  153.     或者在to_date中寫        
  154.     select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual;        
  155.     注意我這只是舉了NLS_DATE_LANGUAGE,固然還有不少,        
  156.     可查看        
  157.     select * from nls_session_parameters        
  158.     select * from V$NLS_PARAMETERS       
  159.   
  160. 8.        
  161.    select count(*)        
  162.    from ( select rownum-1 rnum        
  163.        from all_objects        
  164.        where rownum <= to_date('2002-02-28','yyyy-mm-dd') - to_date('2002-        
  165.        02-01','yyyy-mm-dd')+1        
  166.       )        
  167.    where to_char( to_date('2002-02-01','yyyy-mm-dd')+rnum-1, 'D' )        
  168.         not in ( '1', '7' )        
  169.      
  170.    查找2002-02-28至2002-02-01間除星期一和七的天數        
  171.    在先後分別調用DBMS_UTILITY.GET_TIME, 讓後將結果相減(獲得的是1/100秒, 而不是毫秒).       
  172.   
  173. 9. 查找月份       
  174.     select months_between(to_date('01-31-1999','MM-DD-YYYY'),to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;        
  175.     1        
  176.    select months_between(to_date('02-01-1999','MM-DD-YYYY'),to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;        
  177.     1.03225806451613   
  178.          
  179. 10. Next_day的用法        
  180.     Next_day(date, day)        
  181.       
  182.     Monday-Sunday, for format code DAY        
  183.     Mon-Sun, for format code DY        
  184.     1-7, for format code D       
  185.   
  186. 11        
  187.    select to_char(sysdate,'hh:mi:ss') TIME from all_objects        
  188.    注意:第一條記錄的TIME 與最後一行是同樣的        
  189.    能夠創建一個函數來處理這個問題        
  190.    create or replace function sys_date return date is        
  191.    begin        
  192.    return sysdate;        
  193.    end;        
  194.      
  195.    select to_char(sys_date,'hh:mi:ss') from all_objects;     
  196.        
  197. 12.得到小時數        
  198.      extract()找出日期或間隔值的字段值  
  199.     SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 2:38:40') from offer        
  200.     SQL> select sysdate ,to_char(sysdate,'hh') from dual;        
  201.       
  202.     SYSDATE TO_CHAR(SYSDATE,'HH')        
  203.     -------------------- ---------------------        
  204.     2003-10-13 19:35:21 07        
  205.       
  206.     SQL> select sysdate ,to_char(sysdate,'hh24') from dual;        
  207.       
  208.     SYSDATE TO_CHAR(SYSDATE,'HH24')        
  209.     -------------------- -----------------------        
  210.     2003-10-13 19:35:21 19       
  211.   
  212.          
  213. 13.年月日的處理        
  214.    select older_date,        
  215.        newer_date,        
  216.        years,        
  217.        months,        
  218.        abs(        
  219.         trunc(        
  220.          newer_date-        
  221.          add_months( older_date,years*12+months )        
  222.         )        
  223.        ) days   
  224.          
  225.    from ( select        
  226.         trunc(months_between( newer_date, older_date )/12) YEARS,        
  227.         mod(trunc(months_between( newer_date, older_date )),12 ) MONTHS,        
  228.         newer_date,        
  229.         older_date        
  230.         from (   
  231.               select hiredate older_date, add_months(hiredate,rownum)+rownum newer_date        
  232.               from emp   
  233.              )        
  234.       )       
  235.   
  236. 14.處理月份天數不定的辦法        
  237.    select to_char(add_months(last_day(sysdate) +1, -2), 'yyyymmdd'),last_day(sysdate) from dual       
  238.   
  239. 16.找出今年的天數        
  240.    select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual       
  241.   
  242.    閏年的處理方法        
  243.    to_char( last_day( to_date('02'    | | :year,'mmyyyy') ), 'dd' )        
  244.    若是是28就不是閏年       
  245.   
  246. 17.yyyy與rrrr的區別        
  247.    'YYYY99 TO_C        
  248.    ------- ----        
  249.    yyyy 99 0099        
  250.    rrrr 99 1999        
  251.    yyyy 01 0001        
  252.    rrrr 01 2001       
  253.   
  254. 18.不一樣時區的處理        
  255.    select to_char( NEW_TIME( sysdate, 'GMT','EST'), 'dd/mm/yyyy hh:mi:ss') ,sysdate        
  256.    from dual;       
  257.   
  258. 19.5秒鐘一個間隔        
  259.    Select TO_DATE(FLOOR(TO_CHAR(sysdate,'SSSSS')/300) * 300,'SSSSS') ,TO_CHAR(sysdate,'SSSSS')        
  260.    from dual       
  261.   
  262.    2002-11-1 9:55:00 35786        
  263.    SSSSS表示5位秒數       
  264.   
  265. 20.一年的第幾天        
  266.    select TO_CHAR(SYSDATE,'DDD'),sysdate from dual  
  267.           
  268.    310 2002-11-6 10:03:51       
  269.   
  270. 21.計算小時,分,秒,毫秒        
  271.     select        
  272.      Days,        
  273.      A,        
  274.      TRUNC(A*24) Hours,        
  275.      TRUNC(A*24*60 - 60*TRUNC(A*24)) Minutes,        
  276.      TRUNC(A*24*60*60 - 60*TRUNC(A*24*60)) Seconds,        
  277.      TRUNC(A*24*60*60*100 - 100*TRUNC(A*24*60*60)) mSeconds        
  278.     from        
  279.     (        
  280.      select        
  281.      trunc(sysdate) Days,        
  282.      sysdate - trunc(sysdate) A        
  283.      from dual        
  284.    )       
  285.   
  286.   
  287.    select * from tabname        
  288.    order by decode(mode,'FIFO',1,-1)*to_char(rq,'yyyymmddhh24miss');        
  289.      
  290.    //        
  291.    floor((date2-date1) /365) 做爲年        
  292.    floor((date2-date1, 365) /30) 做爲月        
  293.    d(mod(date2-date1, 365), 30)做爲日.  
  294.   
  295. 23.next_day函數      返回下個星期的日期,day爲1-7或星期日-星期六,1表示星期日  
  296.    next_day(sysdate,6)是從當前開始下一個星期五。後面的數字是從星期日開始算起。        
  297.    1 2 3 4 5 6 7        
  298.    日 一 二 三 四 五 六      
  299.      
  300.    ---------------------------------------------------------------   
  301.      
  302.    select    (sysdate-to_date('2003-12-03 12:55:45','yyyy-mm-dd hh24:mi:ss'))*24*60*60 from ddual  
  303.    日期 返回的是天 而後 轉換爲ss  
  304.        
  305. 24,round[舍入到最接近的日期](day:舍入到最接近的星期日)  
  306.    select sysdate S1,  
  307.    round(sysdate) S2 ,  
  308.    round(sysdate,'year') YEAR,  
  309.    round(sysdate,'month') MONTH ,  
  310.    round(sysdate,'day') DAY from dual  
  311.   
  312. 25,trunc[截斷到最接近的日期,單位爲天] ,返回的是日期類型  
  313.    select sysdate S1,                       
  314.      trunc(sysdate) S2,                 //返回當前日期,無時分秒  
  315.      trunc(sysdate,'year') YEAR,        //返回當前年的1月1日,無時分秒  
  316.      trunc(sysdate,'month') MONTH ,     //返回當前月的1日,無時分秒  
  317.      trunc(sysdate,'day') DAY           //返回當前星期的星期天,無時分秒  
  318.    from dual  
  319.   
  320. 26,返回日期列表中最晚日期  
  321.    select greatest('01-1月-04','04-1月-04','10-2月-04') from dual  
  322.   
  323. 27.計算時間差  
  324.      注:oracle時間差是以天數爲單位,因此換算成年月,日  
  325.        
  326.       select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))/365) as spanYears from dual        //時間差-年  
  327.       select ceil(moths_between(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))) as spanMonths from dual        //時間差-月  
  328.       select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))) as spanDays from dual             //時間差-天  
  329.       select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))*24) as spanHours from dual         //時間差-時  
  330.       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    //時間差-分  
  331.       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 //時間差-秒  
  332.   
  333. 28.更新時間  
  334.      注:oracle時間加減是以天數爲單位,設改變量爲n,因此換算成年月,日  
  335.      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        //改變時間-年  
  336.      select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),add_months(sysdate,n) as newTime from dual                                 //改變時間-月  
  337.      select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n,'yyyy-mm-dd hh24:mi:ss') as newTime from dual            //改變時間-日  
  338.      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         //改變時間-時  
  339.      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      //改變時間-分  
  340.      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   //改變時間-秒  
  341.   
  342. 29.查找月的第一天,最後一天  
  343.      SELECT Trunc(Trunc(SYSDATE, 'MONTH') - 1, 'MONTH') First_Day_Last_Month,  
  344.        Trunc(SYSDATE, 'MONTH') - 1 / 86400 Last_Day_Last_Month,  
  345.        Trunc(SYSDATE, 'MONTH') First_Day_Cur_Month,  
  346.        LAST_DAY(Trunc(SYSDATE, 'MONTH')) + 1 - 1 / 86400 Last_Day_Cur_Month  
  347.    FROM dual;  
相關文章
相關標籤/搜索