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;  
相关文章
相关标签/搜索