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

Oracle中對時間操作的一些總結

2013-11-13 15:27:20  來源: Oracle 

  Oracle中對時間操作的一些總結

  sysdate+(///) 在系統時間基礎上延遲

  sysdate+// 在系統時間基礎上延遲分鐘

  sysdate+/ 在系統時間基礎上延遲小時

  sysdate+ 在系統時間基礎上延遲

  add_months(sysdate) 在系統時間基礎上延遲

  add_months(sysdate*) 在系統時間基礎上延遲

  上月末的日期select last_day(add_months(sysdate )) from dual;

  本月的最後一秒select trunc(add_months(sysdate)MM) /// from dual

  本周星期一的日期select trunc(sysdateday)+ from dual

  年初至今的天數select ceil(sysdate trunc(sysdate year)) from dual;

  今天是今年的第幾周 :select to_char(sysdatefmww) from dual

  今天是本月的第幾周:SELECT TO_CHAR(SYSDATEWW) TO_CHAR(TRUNC(SYSDATEMM)WW) + AS weekOfMon FROM dual

  本月的天數

  SELECT to_char(last_day(SYSDATE)dd) days FROM dual

  今年的天數

  select add_months(trunc(sysdateyear) ) trunc(sysdateyear) from dual

  下個星期一的日期

  SELECT Next_day(SYSDATEmonday) FROM dual

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

  計算工作日方法

  create table t(s datee date);

  alter session set nls_date_format = yyyymmdd;

  insert into t values();

  insert into t values();

  insert into t values();

  insert into t values();

  insert into t values();

  insert into t values();

   這裡假定日期都是不帶時間的否則在所有日期前加trunc即可

  select sees+ total_days

  trunc((es+)/)* + length(replace(substr(to_char(sd)mod(es+)))) work_days

  from t;

   drop table t;

  引此?s=cdfbbcadbecdef&threadid=&perpage=&pagenumber=

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

  判斷當前時間是上午下午還是晚上

  SELECT CASE

  WHEN to_number(to_char(SYSDATEhh)) BETWEEN AND THEN 上午

  WHEN to_number(to_char(SYSDATEhh)) BETWEEN AND THEN 下午

  WHEN to_number(to_char(SYSDATEhh)) BETWEEN AND THEN 晚上

  END

  FROM dual;

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

  Oracle 中的一些處理日期

  將數字轉換為任意時間格式如秒:需要轉換為天/小時

  SELECT to_char(floor(TRUNC(/(*))/))||||to_char(mod(TRUNC(/(*))))||小時 FROM DUAL

  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

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

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

  

  日期和字符轉換函數用法(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)是從當前開始下一個星期五後面的數字是從星期日開始算起

  

  日 一 二 三 四 五 六

  

  select (sysdateto_date( ::yyyymmdd hh:mi:ss))*** from dual

  日期 返回的是天 然後 轉換為ss

  轉此;ID=

  將數字轉換為任意時間格式如秒:需要轉換為天/小時

  SELECT to_char(floor(TRUNC(/(*))/))||||to_char(mod(TRUNC(/(*))))||小時 FROM DUAL

  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

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

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

  

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


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