oracle 日期處理

          1、轉換函數
          與date操作關系最大的就是兩個轉換函數:to_date(),to_char()
          to_date() 作用將字符類型按一定格式轉化為日期類型:
          具體用法:to_date('2004-11-27','yyyy-mm-dd'),前者為字符串,后者為轉換日期格式,注意,前后兩者要以一對應。
          如;to_date('2004-11-27 13:34:43', 'yyyy-mm-dd hh24:mi:ss') 將得到具體的時間

          多種日期格式:

          YYYY:四位表示的年份 
          YYY,YY,Y:年份的最后三位、兩位或一位,缺省為當前世紀 
          MM:01~12的月份編號 
          MONTH:九個字符表示的月份,右邊用空格填補 
          MON:三位字符的月份縮寫 
          WW:一年中的星期 
          D:星期中的第幾天 
          DD:月份中的第幾天 
          DDD:年所中的第幾天 
          DAY:九個字符表示的天的全稱,右邊用空格補齊 
          HH,HH12:一天中的第幾個小時,12進制表示法 
          HH24:一天中的第幾個小時,取值為00~23 
          MI:一小時中的分鐘 
          SS:一分鐘中的秒 
          SSSS:從午夜開始過去的秒數 

          to_char():將日期轉按一定格式換成字符類型
          SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') time from dual;

          TIME
          -------------------
          2004-10-08 15:22:58

          即把當前時間按yyyy-mm-dd hh24:mi:ss格式轉換成字符類型

          在oracle中處理日期大全 

            TO_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  

          24小時格式下時間范圍為: 0:00:00 - 23:59:59....  
          12小時格式下時間范圍為: 1:00:00 - 12:59:59 ....  

          [ZT]日期和??函???
          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';  
          也可以這樣  
          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.  
          獲得小時數  

          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) 作為月  
          mod(mod(date2-date1, 365), 30)作為日.  
          23.next_day函數  
          next_day(sysdate,6)是從當前開始下一個星期五。后面的數字是從星期日開始算起。  
          1 2 3 4 5 6 7  
          日 一 二 三 四 五 六

          oracle中有很多關于日期的函數

          在oracle中有很多關于日期的函數,如: 
          1、add_months()用于從一個日期值增加或減少一些月份 
          date_value:=add_months(date_value,number_of_months) 
          例: 
          SQL> select add_months(sysdate,12) "Next Year" from dual; 

          Next Year 
          ---------- 
          13-11月-04 

          SQL> select add_months(sysdate,112) "Last Year" from dual; 

          Last Year 
          ---------- 
          13-3月 -13 

          SQL> 

          2、current_date()返回當前會放時區中的當前日期 
          date_value:=current_date 
          SQL> column sessiontimezone for a15 
          SQL> select sessiontimezone,current_date from dual; 

          SESSIONTIMEZONE CURRENT_DA 
          --------------- ---------- 
          +08:00 13-11月-03 

          SQL> alter session set time_zone='-11:00' 
            2 / 

          會話已更改。 

          SQL> select sessiontimezone,current_timestamp from dual; 

          SESSIONTIMEZONE CURRENT_TIMESTAMP 
          --------------- ------------------------------------ 
          -11:00 12-11月-03 04.59.13.668000 下午 -11: 
                          00 

          SQL> 

          3、current_timestamp()以timestamp with time zone數據類型返回當前會放時區中的當前日期 
          timestamp_with_time_zone_value:=current_timestamp([timestamp_precision]) 
          SQL> column sessiontimezone for a15 
          SQL> column current_timestamp format a36 
          SQL> select sessiontimezone,current_timestamp from dual; 

          SESSIONTIMEZONE CURRENT_TIMESTAMP 
          --------------- ------------------------------------ 
          +08:00 13-11月-03 11.56.28.160000 上午 +08: 
                          00 

          SQL> alter session set time_zone='-11:00' 
            2 / 

          會話已更改。 

          SQL> select sessiontimezone,current_timestamp from dual; 

          SESSIONTIMEZONE CURRENT_TIMESTAMP 
          --------------- ------------------------------------ 
          -11:00 12-11月-03 04.58.00.243000 下午 -11: 
                          00 

          SQL> 

          4、dbtimezone()返回時區 
          varchar_value:=dbtimezone 
          SQL> select dbtimezone from dual; 

          DBTIME 
          ------ 
          -07:00 

          SQL> 

          5、extract()找出日期或間隔值的字段值 
          date_value:=extract(date_field from [datetime_value|interval_value]) 
          SQL> select extract(month from sysdate) "This Month" from dual; 

          This Month 
          ---------- 
                  11 

          SQL> select extract(year from add_months(sysdate,36)) "3 Years Out" from dual; 

          3 Years Out 
          ----------- 
                 2006 

          SQL> 

          6、last_day()返回包含了日期參數的月份的最后一天的日期 
          date_value:=last_day(date_value) 
          SQL> select last_day(date'2000-02-01') "Leap Yr?" from dual; 

          Leap Yr? 
          ---------- 
          29-2月 -00 

          SQL> select last_day(sysdate) "Last day of this month" from dual; 

          Last day o 
          ---------- 
          30-11月-03 

          SQL> 

          7、localtimestamp()返回會話中的日期和時間 
          timestamp_value:=localtimestamp 
          SQL> column localtimestamp format a28 
          SQL> select localtimestamp from dual; 

          LOCALTIMESTAMP 
          ---------------------------- 
          13-11月-03 12.09.15.433000 
          下午 

          SQL> select localtimestamp,current_timestamp from dual; 

          LOCALTIMESTAMP CURRENT_TIMESTAMP 
          ---------------------------- ------------------------------------ 
          13-11月-03 12.09.31.006000 13-11月-03 12.09.31.006000 下午 +08: 
          下午 00 

          SQL> alter session set time_zone='-11:00'; 

          會話已更改。 

          SQL> select localtimestamp,to_char(sysdate,'DD-MM-YYYY HH:MI:SS AM') "SYSDATE" from dual; 

          LOCALTIMESTAMP SYSDATE 
          ---------------------------- ------------------------ 
          12-11月-03 05.11.31.259000 13-11-2003 12:11:31 下午 
          下午 

          SQL> 

          8、months_between()判斷兩個日期之間的月份數量 
          number_value:=months_between(date_value,date_value) 
          SQL> select months_between(sysdate,date'1971-05-18') from dual; 

          MONTHS_BETWEEN(SYSDATE,DATE'1971-05-18') 
          ---------------------------------------- 
                                        389.855143 

          SQL> select months_between(sysdate,date'2001-01-01') from dual; 

          MONTHS_BETWEEN(SYSDATE,DATE'2001-01-01') 
          ---------------------------------------- 
                                        34.4035409 

          SQL> 

          9、next_day()給定一個日期值,返回由第二個參數指出的日子第一次出現在的日期值(應返回相應日子的名稱字符串)

          ?周相?日期函?

          1.查詢某周的第一天
          select trunc(decode(ww, 53, to_date(yy || '3112', 'yyyyddmm'), to_date(yy || '-' || to_char(ww * 7), 'yyyy-ddd')), 'd') last_day
          from (select substr('2004-32', 1, 4) yy, to_number(substr('2004-32', 6)) ww
                   from dual)

          select trunc(to_date(substr('2003-01',1,5)||to_char((to_number(substr('2003-01',6)))*7),'yyyy-ddd'),'d')-6 first_day from dual

          select min(v_date) from
            (select (to_date('200201','yyyymm') + rownum) v_date
            from all_tables
            where rownum < 370)
          where to_char(v_date,'yyyy-iw') = '2002-49'

          2.查詢某周的最后一天
          select trunc(decode(ww, 53, to_date(yy || '3112', 'yyyyddmm'), to_date(yy || '-' || to_char(ww * 7), 'yyyy-ddd')), 'd') - 6 first_day
            from (select substr('2004-33', 1, 4) yy, to_number(substr('2004-33', 6)) ww
                    from dual)
                    
          select trunc(to_date(substr('2003-01',1,5)||to_char((to_number(substr('2003-01',6)))*7),'yyyy-ddd'),'d') last_day from dual

          select max(v_date) from
            (select (to_date('200408','yyyymm') + rownum) v_date
            from all_tables
            where rownum < 370)
          where to_char(v_date,'yyyy-iw') = '2004-33'

          3.查詢某周的日期
          select min_date, to_char(min_date,'day') day from
          (select to_date(substr('2004-33',1,4)||'001'+rownum-1,'yyyyddd') min_date 
                  from all_tables
            where rownum <= decode(mod(to_number(substr('2004-33',1,4)),4),0,366,365)  
            union

            select to_date(substr('2004-33',1,4)-1||
                   decode(mod(to_number(substr('2004-33',1,4))-1,4),0,359,358)+rownum,'yyyyddd') min_date 
                  from all_tables          
                    where rownum <= 7
            union

            select to_date(substr('2004-33',1,4)+1||'001'+rownum-1,'yyyyddd') min_date 
                  from all_tables          
                    where rownum <= 7                       
          )
          where to_char(min_date,'yyyy-iw') ='2004-33'

          posted on 2007-04-02 14:26 leoli 閱讀(777) 評論(0)  編輯  收藏 所屬分類: database

          導航

          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          統計

          常用鏈接

          留言簿(6)

          隨筆分類

          隨筆檔案(17)

          文章分類(86)

          收藏夾(3)

          flex blog

          good site

          java blog

          my friend

          tools

          抓蝦

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 西乌珠穆沁旗| 洪湖市| 犍为县| 秀山| 买车| 宝坻区| 陆丰市| 沐川县| 错那县| 怀仁县| 馆陶县| 博乐市| 米泉市| 新兴县| 社旗县| 内乡县| 东城区| 汶川县| 蓬溪县| 古丈县| 藁城市| 太康县| 棋牌| 浠水县| 武安市| 长沙市| 大埔区| 仙居县| 康马县| 天镇县| 衡阳市| 大足县| 改则县| 两当县| 新闻| 山丹县| 琼结县| 丽江市| 南木林县| 县级市| 滦南县|