• oracle日期处理完整版


    O_DATE格式
       Day:     
       dd       number         12
       dy       abbreviated    fri         
       day      spelled out    friday                        
       ddspth   spelled out,   ordinal   twelfth
       Month:   
       mm       number         03
       mon      abbreviated    mar
       month    spelled out    march  
       Year:                          
       yy       two  digits    98
       yyyy     four  digits   1998     
     
    字串2
     
       
       24小时格式下时间范围为: 0:00:00 - 23:59:59....
       12小时格式下时间范围为: 1:00:00 - 12:59:59 ....    
    1.
       日期和字符转换函数用法(to_date,to_char)      
     
    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';
       也可以这样
    字串9
       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 字串3
     
             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
     
     
      日期和字符转换函数用法(to_date,to_char)
             We overwrite NLS_DATE_FORMAT into different formats for the session. 
             SQL> alter session set nls_date_format = 'DD-MON-RR'; Session altered.
             SQL> set pagesize 0
         SQL> set linesize 130
         SQL> select * from nls_session_parameters;
         NLS_LANGUAGE                   AMERICAN 字串6
    字串4
     

         NLS_TERRITORY                  AMERICA
         NLS_CURRENCY                   $
         NLS_ISO_CURRENCY               AMERICA
         NLS_NUMERIC_CHARACTERS         .,
         NLS_CALENDAR                   GREGORIAN
         NLS_DATE_FORMAT                DD-MON-RR
         NLS_DATE_LANGUAGE              AMERICAN
         NLS_SORT                       BINARY
         NLS_TIME_FORMAT                HH.MI.SSXFF AM 字串1
    字串1
     
         NLS_TIMESTAMP_FORMAT           DD-MON-RR HH.MI.SSXFF AM
         NLS_TIME_TZ_FORMAT             HH.MI.SSXFF AM TZH:TZM
         NLS_TIMESTAMP_TZ_FORMAT        DD-MON-RR HH.MI.SSXFF AM TZH:TZM
         NLS_DUAL_CURRENCY              $
         NLS_COMP                       BINARY
     
         15 rows selected.
              specify it in SQL statement:
             
            SQL> select to_date('03-SEP-1999','DD-MON-YYYY') from dual;
             03-SEP-99
            SQL> alter session set nls_date_format = 'MM-DD-YYYY';
                 Session altered.
    字串6
     

                
            SQL> select to_date('03-SEP-99','DD-MON-YY') from dual;
                 TO_DATE('0
                 ----------
                 09-03-1999 
            SQL> alter session set nls_date_format = 'RRRR-MM-DD';
                 Session altered. 
                
            SQL> select to_date('03-SEP-1999','DD-MON-YYYY') from dual;
                 TO_DATE('0
                 ----------
                 1999-09-03 
        When we use TO_CHAR function, we get expected results of format from  current SQL statement:   字串9
            SQL> alter session set nls_date_format = 'MM-DD-YY';
                 Session altered. 
            SQL> select to_char(sysdate,'dd-mm-yyyy') from dual;
                 TO_CHAR(SYSDATE,'DD-MM-YYYY') 
                 07-09-1999 
            SQL> alter session set nls_date_format = 'RR-MON-DD';
                 Session altered. 
            SQL> select to_char(sysdate,'dd-mon-yy') from dual;
                 TO_CHAR(SYSDATE,'DD-MON-YY') 
                 07-sep-99   字串7
            SQL> select to_char(sysdate,'dd-Mon-yy') from dual;
                 TO_CHAR(SYSDATE,'DD-MON-YY')   字串1
                 07-Sep-99
    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;  
    字串4
     

       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;   字串5
       end; 
       
       select to_char(sys_date,'hh:mi:ss') from all_objects; 
    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; 字串8
             
             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 )
     
    字串6
     
                       )
                  ) 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 ) 字串3
               )
     
    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
    字串2
       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, 字串2
     
    字串7
     
               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
       )
     
       
    9i以上版本
        -----------------------------
        SQL>select to_char(systimestamp,'yyyy-mm-dd hh24:mi:ssxff') time1,
        to_char(current_timestamp) time2 from dual;      字串3
        TIME1                         TIME2
        ----------------------------- ----------------------------------------------------------------
        2003-10-24 10:48:45.656000    24-OCT-03 10.48.45.656000 AM +08:00
        可以看到,毫秒在to_char中对应的是FF。
       
        SQL> select to_timestamp('2003-10-24 10:48:45.656000','yyyy-mm-dd hh24:mi:ssxff') from dual;
       
        TO_TIMESTAMP('2003-10-2410:48:
        -------------------------------------------------
        24-10月-03 10.48.45.656000000 上午
     
    22.
    floor((date2-date1) /365) 作为年
    floor((date2-date1, 365) /30) 作为月
    mod(mod(date2-date1, 365), 30)作为日.
    23.next_day函数
    next_day(sysdate,6)是从当前开始下一个星期五。后面的数字是从星期日开始算起。 
    1  2  3  4  5  6  7  
    字串2
     
    日 一 二 三 四 五 六 
     
    24.取出一个时间段中星期日星期六的天数
    function weekends( p_date1 in date, p_date2 in date )
    return number
    as
         l_date1 date default least(p_date1,p_date2);
         l_date2 date default greatest(p_date1,p_date2);
         l_days  number default trunc(l_date2-l_date1)+1;
         l_cnt   number;
    begin
         select count(*) into l_cnt
           from (select rownum r 
                   from all_objects where rownum <= l_days)
          where to_char(l_date1+r-1,'dy') in ( 'sat','sun' );
     
         return l_cnt;
    end;
     
  • 相关阅读:
    锐浪报表应用系列二
    论产品和项目
    我的处女作
    今天晚上吃什么?
    今日晚餐
    PYTHON+数据库
    周末看到小区有个阿姨溜羊驼
    AD 10使用技巧---新学习
    使用.NET进行高效率互联网敏捷开发的思考和探索【一、概述】
    【开发随感】【一】【开发基础的基础】
  • 原文地址:https://www.cnblogs.com/wenjl520/p/1445775.html
Copyright © 2020-2023  润新知