熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

Oracle日期時間函數的應用

2013-11-13 22:12:07  來源: Oracle 

  轉換函數

  與date操作關系最大的就是兩個轉換函數to_date()to_char()

  to_date() 作用將字符類型按一定格式轉化為日期類型

  具體用法:to_date(yyyymmdd)前者為字符串後者為轉換日期格式注意前後兩者要以一對應

  如;to_date( :: yyyymmdd hh:mi:ss) 將得到具體的時間

  多種日期格式

  YYYY四位表示的年份

  YYYYYY年份的最後三位兩位或一位缺省為當前世紀

  MM~的月份編號

  MONTH九個字符表示的月份右邊用空格填補

  MON三位字符的月份縮寫

  WW一年中的星期

  D星期中的第幾天

  DD月份中的第幾天

  DDD年所中的第幾天

  DAY九個字符表示的天的全稱右邊用空格補齊

  HHHH一天中的第幾個小時進制表示法

  HH一天中的第幾個小時取值為~

  MI一小時中的分鐘

  SS一分鐘中的秒

  SSSS從午夜開始過去的秒數

  to_char():將日期轉按一定格式換成字符類型

  SQL> select to_char(sysdateyyyymmdd hh:mi:ss) time from dual;

  TIME

  

   ::

  即把當前時間按yyyymmdd hh:mi:ss格式轉換成字符類型

  在oracle中處理日期大全

  TO_DATE格式

  Day:

  dd number

  dy abbreviated fri

  day spelled out friday

  ddspth spelled out ordinal twelfth

  Month:

  mm number

  mon abbreviated mar

  month spelled out march

  Year:

  yy two digits

  yyyy four digits

  小時格式下時間范圍為 :: ::

  小時格式下時間范圍為 :: ::

  [ZT]日期和??函???

  

  日期和字符轉換函數用法(to_dateto_char)

  

  select to_char( to_date(J)Jsp) from dual

  顯示Two Hundred TwentyTwo

  

  求某天是星期幾

  select to_char(to_date(yyyymmdd)day) from dual;

  星期一

  select

  to_char(to_date(yyyymmdd)dayNLS_DATE_LANGUAGE

  = American) from dual;

  monday

  設置日期語言

  ALTER SESSION SET NLS_DATE_LANGUAGE=AMERICAN;

  也可以這樣

  TO_DATE ( YYYYmmdd NLS_DATE_LANGUAGE = American)

  

  兩個日期間的天數

  select floor(sysdate to_date(yyyymmdd)) from dual;

   時間為null的用法

  select id active_date from table

  UNION

  select TO_DATE(null) from dual;

  注意要用TO_DATE(null)

  

  a_date between to_date(yyyymmdd) and

  to_date(yyyymmdd)

  那麼號中午點之後和號的點之前是不包含在這個范圍之內的

  所以當時間需要精確的時候覺得to_char還是必要的

   日期格式沖突問題

  輸入的格式要看你安裝的ORACLE字符集的類型 比如: USASCII date格式的類型就是: Jan

  alter system set NLS_DATE_LANGUAGE = American

  alter session set NLS_DATE_LANGUAGE = American

  或者在to_date中寫

  select

  to_char(to_date(yyyymmdd)dayNLS_DATE_LANGUAGE

  = American) from dual;

  注意我這只是舉了NLS_DATE_LANGUAGE當然還有很多

  可查看

  select * from nls_session_parameters

  select * from V$NLS_PARAMETERS

  

  select count(*)

  from ( select rownum rnum

  from all_objects

  where rownum <= to_date(yyyymmdd) to_date(

  yyyymmdd)+

  )

  where to_char( to_date(yyyymmdd)+rnum D )

  not

  in ( )

  查找間除星期一和七的天數

  在前後分別調用DBMS_UTILITYGET_TIME 讓後將結果相減(得到的是/ 而不是毫秒)

  

  select months_between(to_date(MMDDYYYY)

  to_date(MMDDYYYY)) MONTHS FROM DUAL;

  

  select months_between(to_date(MMDDYYYY)

  to_date(MMDDYYYY)) MONTHS FROM DUAL;

  

   Next_day的用法

  Next_day(date day)

  MondaySunday for format code DAY

  MonSun for format code DY

   for format code D

  

  select to_char(sysdatehh:mi:ss) TIME from all_objects

  注意第一條記錄的TIME 與最後一行是一樣的

  可以建立一個函數來處理這個問題

  create or replace function sys_date return date is

  begin

  return sysdate;

  end;

  select to_char(sys_datehh:mi:ss) from all_objects;

  

  獲得小時數

  SELECT EXTRACT(HOUR FROM TIMESTAMP ::) from offer

  SQL> select sysdate to_char(sysdatehh) from dual;

  SYSDATE TO_CHAR(SYSDATEHH)

  

   ::

  SQL> select sysdate to_char(sysdatehh) from dual;

  SYSDATE TO_CHAR(SYSDATEHH)

  

   ::

  獲取年月日與此類似

  

  年月日的處理

  select older_date

  newer_date

  years

  months

  abs(

  trunc(

  newer_date

  add_months( older_dateyears*+months )

  )

  ) days

  from ( select

  trunc(months_between( newer_date older_date )/) YEARS

  mod(trunc(months_between( newer_date older_date ))

   ) MONTHS

  newer_date

  older_date

  from ( select hiredate older_date

  add_months(hiredaterownum)+rownum newer_date

  from emp )

  )

  

  處理月份天數不定的辦法

  select to_char(add_months(last_day(sysdate) + )

  yyyymmdd)last_day(sysdate) from dual

  

  找出今年的天數

  select add_months(trunc(sysdateyear) ) trunc(sysdateyear)

  from dual

  閏年的處理方法

  to_char( last_day( to_date( || :yearmmyyyy) ) dd )

  如果是就不是閏年

  

  yyyy與rrrr的區別

  YYYY TO_C

  

  yyyy

  rrrr

  yyyy

  rrrr

  不同時區的處理

  select to_char( NEW_TIME( sysdate GMTEST) dd/mm/yyyy

  hh:mi:ss) sysdate

  from dual;

  

  秒鐘一個間隔

  Select TO_DATE(FLOOR(TO_CHAR(sysdateSSSSS)/) * SSSSS)

  TO_CHAR(sysdateSSSSS)

  from dual

   ::

  SSSSS表示位秒數

  

  一年的第幾天

  select TO_CHAR(SYSDATEDDD)sysdate from dual

   ::

  計算小時毫秒

  select

  Days

  A

  TRUNC(A*) Hours

  TRUNC(A** *TRUNC(A*)) Minutes

  TRUNC(A*** *TRUNC(A**)) Seconds

  TRUNC(A**** *TRUNC(A***)) mSeconds

  from

  (

  select

  trunc(sysdate) Days

  sysdate trunc(sysdate) A

  from dual

  )

  select * from tabname

  order by decode(modeFIFO)*to_char(rqyyyymmddhhmiss);

  //

  floor((datedate) /) 作為年

  floor((datedate ) /) 作為月

  mod(mod(datedate ) )作為日

  next_day函數

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

  

  日 一 二 三 四 五 六

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

  在oracle中有很多關於日期的函數

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

  date_value:=add_months(date_valuenumber_of_months)

  例

  SQL> select add_months(sysdate) Next Year from dual;

  Next Year

  

  

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

  Last Year

  

  

  SQL>

  current_date()返回當前會放時區中的當前日期

  date_value:=current_date

  SQL> column sessiontimezone for a

  SQL> select sessiontimezonecurrent_date from dual;

  SESSIONTIMEZONE CURRENT_DA

  

  +:

  SQL> alter session set time_zone=:

   /

  會話已更改

  SQL> select sessiontimezonecurrent_timestamp from dual;

  SESSIONTIMEZONE CURRENT_TIMESTAMP

  

  : 下午 :

  

  SQL>

  current_timestamp()以timestamp with time zone數據類型返回當前會放時區中的當前日期

  timestamp_with_time_zone_value:=current_timestamp([timestamp_precision])

  SQL> column sessiontimezone for a

  SQL> column current_timestamp format a

  SQL> select sessiontimezonecurrent_timestamp from dual;

  SESSIONTIMEZONE CURRENT_TIMESTAMP

  

  +: 上午 +:

  

  SQL> alter session set time_zone=:

   /

  會話已更改

  SQL> select sessiontimezonecurrent_timestamp from dual;

  SESSIONTIMEZONE CURRENT_TIMESTAMP

  

  : 下午 :

  

  SQL>

  dbtimezone()返回時區

  varchar_value:=dbtimezone

  SQL> select dbtimezone from dual;

  DBTIME

  

  :

  SQL>

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

  date_value:=extract(date_field from [datetime_value|interval_value])

  SQL> select extract(month from sysdate) This Month from dual;

  This Month

  

  

  SQL> select extract(year from add_months(sysdate)) Years Out from

  dual;

   Years Out

  

  

  SQL>

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

  date_value:=last_day(date_value)

  SQL> select last_day(date) Leap Yr? from dual;

  Leap Yr?

  

  

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

  Last day o

  

  

  SQL>

  localtimestamp()返回會話中的日期和時間

  timestamp_value:=localtimestamp

  SQL> column localtimestamp format a

  SQL> select localtimestamp from dual;

  LOCALTIMESTAMP

  

  

  下午

  SQL> select localtimestampcurrent_timestamp from dual;

  LOCALTIMESTAMP CURRENT_TIMESTAMP

  

   下午 +:

  下午

  SQL> alter session set time_zone=:;

  會話已更改

  SQL> select localtimestampto_char(sysdateDDMMYYYY HH:MI:SS AM)

  SYSDATE from dual;

  LOCALTIMESTAMP SYSDATE

  

   :: 下午

  下午

  SQL>

  months_between()判斷兩個日期之間的月份數量

  number_value:=months_between(date_valuedate_value)

  SQL> select months_between(sysdatedate) from dual;

  MONTHS_BETWEEN(SYSDATEDATE)

  

  

  SQL> select months_between(sysdatedate) from dual;

  MONTHS_BETWEEN(SYSDATEDATE)

  

  

  SQL>

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

  ?周相?日期函?

  查詢某周的第一天

  select trunc(decode(ww to_date(yy || yyyyddmm)

  to_date(yy || || to_char(ww * ) yyyyddd)) d) last_day

  from (select substr( ) yy to_number(substr(

  )) ww

  from dual)

  select

  trunc(to_date(substr()||to_char((to_number(substr()))*)yyyyddd)d)

  first_day from dual

  select min(v_date) from

  (select (to_date(yyyymm) + rownum) v_date

  from all_tables

  where rownum < )

  where to_char(v_dateyyyyiw) =

  查詢某周的最後一天

  select trunc(decode(ww to_date(yy || yyyyddmm)

  to_date(yy || || to_char(ww * ) yyyyddd)) d)

  first_day

  from (select substr( ) yy to_number(substr(

  )) ww

  from dual)

  select

  trunc(to_date(substr()||to_char((to_number(substr()))*)yyyyddd)d)

  last_day from dual

  select max(v_date) from

  (select (to_date(yyyymm) + rownum) v_date

  from all_tables

  where rownum < )

  where to_char(v_dateyyyyiw) =

  查詢某周的日期

  select min_date to_char(min_dateday) day from

  (select to_date(substr()||+rownumyyyyddd)

  min_date

  from all_tables

  where rownum <=

  decode(mod(to_number(substr())))

  union

  select to_date(substr()||

  decode(mod(to_number(substr())))+rownumyyyyddd)

  min_date

  from all_tables

  where rownum <=

  union

  select to_date(substr()+||+rownumyyyyddd)

  min_date

  from all_tables

  where rownum <=

  )

  where to_char(min_dateyyyyiw) =


From:http://tw.wingwit.com/Article/program/Oracle/201311/18444.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.