<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 12  文章 - 0  trackbacks - 0
    <2010年7月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    我參與的團隊

    隨筆檔案

    搜索

    •  

    最新評論

    Oracle時間日期操作
    sysdate+(5/24/60/60) 在系統時間基礎上延遲5秒
    sysdate+5/24/60 在系統時間基礎上延遲5分鐘
    sysdate+5/24 在系統時間基礎上延遲5小時
    sysdate+5 在系統時間基礎上延遲5天
    add_months(sysdate,-5) 在系統時間基礎上延遲5月
    add_months(sysdate,-5*12) 在系統時間基礎上延遲5年


    上月末的日期:select last_day(add_months(sysdate, -1)) from dual;
    本月的最后一秒:select trunc(add_months(sysdate,1),'MM') - 1/24/60/60 from dual
    本周星期一的日期:select trunc(sysdate,'day')+1 from dual


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

    今天是今年的第幾周 :select to_char(sysdate,'fmww') from dual
    今天是本月的第幾周:SELECT TO_CHAR(SYSDATE,'WW') - TO_CHAR(TRUNC(SYSDATE,'MM'),'WW') + 1 AS "weekOfMon" FROM dual

    本月的天數
    SELECT to_char(last_day(SYSDATE),'dd') days FROM dual
    今年的天數
    select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual
    下個星期一的日期
    SELECT Next_day(SYSDATE,'monday') FROM dual


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

    --計算工作日方法

    create table t(s date,e date);
    alter session set nls_date_format = 'yyyy-mm-dd';
    insert into t values('2003-03-01','2003-03-03');
    insert into t values('2003-03-02','2003-03-03');
    insert into t values('2003-03-07','2003-03-08');
    insert into t values('2003-03-07','2003-03-09');
    insert into t values('2003-03-05','2003-03-07');
    insert into t values('2003-02-01','2003-03-31');

    -- 這里假定日期都是不帶時間的,否則在所有日期前加trunc即可。
    select s,e,e-s+1 total_days,
    trunc((e-s+1)/7)*5 + length(replace(substr('01111100111110',to_char(s,'d'),mod(e-s+1,7)),'0','')) work_days
    from t;

    -- drop table t;

    引此:http://www.itpub.net/showthread.php?s=1635506cd5f48b1bc3adbe4cde96f227&threadid=104060&perpage=15&pagenumber=1


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

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

    SELECT CASE
    WHEN to_number(to_char(SYSDATE,'hh24')) BETWEEN 6 AND 11 THEN '上午'
    WHEN to_number(to_char(SYSDATE,'hh24')) BETWEEN 11 AND 17 THEN '下午'
    WHEN to_number(to_char(SYSDATE,'hh24')) BETWEEN 17 AND 21 THEN '晚上'
    END
    FROM dual;


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

    Oracle 中的一些處理日期



    將數字轉換為任意時間格式.如秒:需要轉換為天/小時
    SELECT to_char(floor(TRUNC(936000/(60*60))/24))||'天'||to_char(mod(TRUNC(936000/(60*60)),24))||'小時' FROM DUAL


    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

    8.
    select count(*)
    from ( select rownum-1 rnum
    from all_objects
    where rownum <= to_date('2002-02-28','yyyy-mm-dd') - to_date('2002- <br /> 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()給定一個日期值,返回由第二個參數指出的日子第一次出現在的日期值(應返回相應日子的名稱字符串)

      說明:

      單行日期函數

      單行日期函數操作data數據類型,絕大多數都有data數據類型的參數,絕大多數返回的也是data數據類型的值。

      add_months(,)

      返回日期d加上i個月后的結果。i可以使任意整數。如果i是一個小數,那么數據庫將隱式的他轉換成整數,將會截去小數點后面的部分。

      last_day()

      函數返回包含日期d的月份的最后一天

      months_between(,)

      返回d1和d2之間月的數目,如果d1和d2的日的日期都相同,或者都使該月的最后一天,那么將返回一個整數,否則會返回的結果將包含一個分數。

      new_time(,,)

      d1是一個日期數據類型,當時區tz1中的日期和時間是d時,返回時區tz2中的日期和時間。tz1和tz2時字符串。

      next_day(,)

      返回日期d后由dow給出的條件的第一天,dow使用當前會話中給出的語言指定了一周中的某一天,返回的時間分量與d的時間分量相同。

      select next_day(''01-jan-2000'',''monday'') "1st monday",next_day(''01-nov-2004'',''tuesday'')+7 "2nd tuesday") from dual;1st monday 2nd tuesday03-jan-2000 09-nov-2004

      round([,])

      將日期d按照fmt指定的格式舍入,fmt為字符串。

      syadate

      函數沒有參數,返回當前日期和時間。

      trunc([,])

      返回由fmt指定的單位的日期d.

      單行轉換函數

      單行轉換函數用于操作多數據類型,在數據類型之間進行轉換。

      chartorwid()

      c 使一個字符串,函數將c轉換為rwid數據類型。

      select test_id from test_case where rowid=chartorwid(''aaaa0saacaaaaliaaa'')

      convert(,[,])

      c尾字符串,dset、sset是兩個字符集,函數將字符串c由sset字符集轉換為dset字符集,sset的缺省設置為數據庫的字符集。

      hextoraw()

      x為16進制的字符串,函數將16進制的x轉換為raw數據類型。

      rawtohex()

      x是raw數據類型字符串,函數將raw數據類轉換為16進制的數據類型。

      rowidtochar()

      函數將rowid數據類型轉換為char數據類型。

      to_char([[,)

      x是一個data或number數據類型,函數將x轉換成fmt指定格式的char數據類型,如果x為日期nlsparm=nls_date_language 控制返回的月份和日份所使用的語言。如果x為數字nlsparm=nls_numeric_characters 用來指定小數位和千分位的分隔符,以及貨幣符號。

      nls_numeric_characters ="dg", nls_currency="string"

      to_date([,[,)

      c表示字符串,fmt表示一種特殊格式的字符串。返回按照fmt格式顯示的c,nlsparm表示使用的語言。函數將字符串c轉換成date數據類型。

      to_multi_byte()

      c表示一個字符串,函數將c的擔子截字符轉換成多字節字符。

      to_number([,[,)

      c表示字符串,fmt表示一個特殊格式的字符串,函數返回值按照fmt指定的格式顯示。nlsparm表示語言,函數將返回c代表的數字。

      to_single_byte()

      將字符串c中得多字節字符轉化成等價的單字節字符。該函數僅當數據庫字符集同時包含單字節和多字節字符時才使用。

    Oracle關于時間/日期的操作

      1.日期時間間隔操作

      當前時間減去7分鐘的時間

      select sysdate,sysdate - interval '7' MINUTE from dual

      當前時間減去7小時的時間

      select sysdate - interval '7' hour from dual

      當前時間減去7天的時間

      select sysdate - interval '7' day from dual

      當前時間減去7月的時間

      select sysdate,sysdate - interval '7' month from dual

      當前時間減去7年的時間

      select sysdate,sysdate - interval '7' year from dual

      時間間隔乘以一個數字

      select sysdate,sysdate - 8 *interval '2' hour from dual

      2.日期到字符操作

      select sysdate,to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual

      select sysdate,to_char(sysdate,'yyyy-mm-dd hh:mi:ss') from dual

      select sysdate,to_char(sysdate,'yyyy-ddd hh:mi:ss') from dual

      select sysdate,to_char(sysdate,'yyyy-mm iw-d hh:mi:ss') from dual

      參考oracle的相關關文檔(ORACLE901DOC/SERVER.901/A90125/SQL_ELEMENTS4.HTM#48515)

      3. 字符到日期操作

      select to_date('2003-10-17 21:15:37','yyyy-mm-dd hh24:mi:ss') from dual

      具體用法和上面的to_char差不多。

      4. trunk/ ROUND函數的使用

      select trunc(sysdate ,'YEAR') from dual

      select trunc(sysdate ) from dual

      select to_char(trunc(sysdate ,'YYYY'),'YYYY') from dual

      5.oracle有毫秒級的數據類型

      --返回當前時間 年月日小時分秒毫秒

      select to_char(current_timestamp(5),'DD-MON-YYYY HH24:MI:SSxFF') from dual;

      --返回當前 時間的秒毫秒,可以指定秒后面的精度(最大=9)

      select to_char(current_timestamp(9),'MI:SSxFF') from dual;

      6.計算程序運行的時間(ms)

      declare

      type rc is ref cursor;

      l_rc rc;

      l_dummy all_objects.object_name%type;

      l_start number default dbms_utility.get_time;

      begin

      for I in 1 .. 1000

      loop

      open l_rc for

      'select object_name from all_objects '||

      'where object_id = ' || i;

      fetch l_rc into l_dummy;

      close l_rc;

      end loop;

      dbms_output.put_line

      ( round( (dbms_utility.get_time-l_start)/100, 2 ) ||

      ' seconds...' );

      end;

    posted on 2010-07-14 14:52 天問 閱讀(4223) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲一区免费视频| 免费毛片在线看不用播放器 | 亚洲av无码专区国产不乱码| 亚洲黄色片免费看| 亚洲免费人成视频观看| 最近中文字幕大全免费视频| 久久亚洲国产精品成人AV秋霞| 久久精品无码专区免费东京热| 亚洲AV色香蕉一区二区| 久久国产免费观看精品| 亚洲αv在线精品糸列| 99精品视频免费在线观看| 亚洲精品一区二区三区四区乱码| 色播精品免费小视频| 日本亚洲精品色婷婷在线影院| 午夜高清免费在线观看| 天天综合亚洲色在线精品| 亚洲成A∨人片天堂网无码| www在线观看免费视频| 亚洲AV无码不卡无码| 全免费毛片在线播放| 亚洲精品精华液一区二区 | 美女巨胸喷奶水视频www免费| 国产亚洲AV无码AV男人的天堂| 久久aⅴ免费观看| 亚洲女人初试黑人巨高清| 午夜免费福利在线观看| 一级毛片免费播放试看60分钟| 久久精品亚洲一区二区| 在线永久看片免费的视频| 亚洲精品乱码久久久久久V| 国产精品亚洲mnbav网站| 精品无码AV无码免费专区| 亚洲αⅴ无码乱码在线观看性色| 精品国产日韩亚洲一区| 麻豆国产精品免费视频| 精品亚洲视频在线| 亚洲卡一卡2卡三卡4卡无卡三| 日韩成全视频观看免费观看高清| 成人免费无码H在线观看不卡| 亚洲国产精品专区|