天天看點

ORACLE時間處理大全

舉例說明:

1、日期字元轉換函數to_date(),to_char()

   SQL:select to_date('20080229132545','yyyy-mm-dd hh24:mi:ss') from dual ; RESULT:2008-2-29 13:25:45

   SQL:select to_char(sysdate,'hh:mi:ss') TIME from dual; RESULT:10:51:43

2、

   SQL:select to_char( to_date(2008,'J'),'Jsp') from dual; RESULT:Two Thousand Eight

3、檢視哪天的年份

   SQL:select to_char(to_date('2008-2-29','yyyy-mm-dd'),'year') from dual;     RESULT:two thousand eight

   SQL:select to_char(to_date('2008-2-29','yyyy-mm-dd'),'yyyy') from dual;     RESULT:2008

4、檢視哪天的月份

   SQL:select to_char(to_date('2008-2-29','yyyy-mm-dd'),'month') from dual;RESULT:2月

   SQL:select to_char(to_date('2008-2-29','yyyy-mm-dd'),'mm') from dual;    RESULT:02

5、檢視哪天是星期幾

   SQL:select to_char(to_date('2008-2-29','yyyy-mm-dd'),'day') from dual;      RESULT:星期五

   SQL:select to_char(to_date('2008-02-29','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual;

   RESULT:friday

   SQL:select to_char(to_date('2008-2-29','yyyy-mm-dd'),'dd') from dual;RESULT:29

6、檢視兩個日期之間的天數

   SQL:select floor(sysdate - to_date('20080201','yyyymmdd')) from dual; RESULT:28

   注:sysdate是2008-02-29

7、取兩個日期之間除了周六周日的天數

   SQL:

   select count(*)

   from ( select rownum-1 rnum

   from all_objects

   where rownum <= to_date('2008-02-29','yyyy-mm-dd') - to_date('2008-

   02-01','yyyy-mm-dd')+1

   )

   where to_char( to_date('2008-02-01','yyyy-mm-dd')+rnum-1, 'D' )

   not

   in ( '6', '7' )

   RESULT:

   21

8、檢視兩個日期之間的月 數

   SQL:select months_between(to_date('2-29-2008', 'MM-DD-YYYY'),to_date('10-1-2007', 'MM-DD-YYYY')) "MONTHS" FROM DUAL;

   RESULT:4.90322580645161

9、next_day函數

   next_day(sysdate,6)是從目前開始下一個星期五。後面的數字是從星期日開始算起。

   1 2 3 4 5 6 7

   日 一 二 三 四 五 六

10、檢視小時分秒

   select sysdate ,to_char(sysdate,'hh') from dual;

   select sysdate ,to_char(sysdate,'mi') from dual;

   select sysdate ,to_char(sysdate,'ss') from dual;

11、取一年的天數(例如 今年2008)

   SQL:select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual ;RESULT:366

12、 yyyy與rrrr的差別

   yyyy 99 0099

   rrrr 99 1999

   yyyy 01 0001

   rrrr 01 2001

13、一年的第幾天

   SQL:select TO_CHAR(SYSDATE,'DDD'),sysdate from dual ;RESULT:060

   注:sysdate是2008-02-29

14、add_months()用于從一個日期值增加或 減少一些月份

   SQL:select add_months(sysdate,12) from dual;                      RESULT:2009-2-28 11:23:50

15、extract()找出日期或間隔值的字段值

   SQL:select extract(month from sysdate) from dual; RESULT:2

   SQL:select extract(year from add_months(sysdate,36)) from dual; RESULT:2011

16、last_day()傳回包含了日期參數的月份的最後一天的日期

   SQL:select last_day(sysdate) from dual;                                         RESULT:2008-2-29

===================================================================================================================

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 ....  

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

 日期和字元轉換函數用法(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

   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

   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.

      

    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: 

    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 

    sql> select to_char(sysdate,'dd-Mon-yy') from dual;

       TO_CHAR(SYSDATE,'DD-MON-YY') 

       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; 

  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

  )

 

  

9i以上版本

  -----------------------------

   sql>select to_char(systimestamp,'yyyy-mm-dd hh24:mi:ssxff') time1,

   to_char(current_timestamp) time2 from dual;

  

  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 

日 一 二 三 四 五 六 

 

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;O