隨筆-314  評論-209  文章-0  trackbacks-0
          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-?
          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)是從當前開始下一個星期五。后面的數字是從星期日開始算起。
          posted on 2006-08-10 16:34 xzc 閱讀(2681) 評論(8)  編輯  收藏 所屬分類: Oracle

          評論:
          # re: oracle日期處理完全版[未登錄] 2007-01-29 12:57 | xzc
          select 1,to_char(sysdate,'Day,Month DD,YYYY','NLS_DATE_LANGUAGE = American') from dual  回復  更多評論
            
          # re: oracle日期處理完全版 2007-09-14 12:56 | xzc
          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  回復  更多評論
            
          # re: oracle日期處理完全版 2007-09-14 12:57 | xzc
          ============================================

          --計算工作日方法

          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
            回復  更多評論
            
          # re: oracle日期處理完全版[未登錄] 2009-07-05 05:07 | aa
          6中的a_date是什么?  回復  更多評論
            
          # re: oracle日期處理完全版 2010-05-13 21:10 | xzc
          題目: 輸入4個值[2008,12,2009,2], 要求一段SQL, 不另創新表, 得到如下結果:

          12 2008-12-1 2008-12-31
          01 2009-1-1 2009-1-31
          02 2009-2-1 2009-2-28

          條件: 起始年, 起始月, 截至年, 截至月
          結果: 月份, 月的第一天, 月的最后一天
          解答:
          Sql代碼
          select to_char(tt.d, 'mm'), tt.d, last_day(tt.d)
          from (select ADD_MONTHS(zz.s, rownum - 1) d
          from (select to_date('2008' || '12' || '01', 'yyyymmdd') s,
          to_date('2009' || '02' || '01', 'yyyymmdd') e
          from dual) zz,
          (select * from user_objects)
          where rownum <= MONTHS_BETWEEN(zz.e, zz.s) + 1) tt

          select to_char(tt.d, 'mm'), tt.d, last_day(tt.d)
          from (select ADD_MONTHS(zz.s, rownum - 1) d
          from (select to_date('2008' || '12' || '01', 'yyyymmdd') s,
          to_date('2009' || '02' || '01', 'yyyymmdd') e
          from dual) zz,
          (select * from user_objects)
          where rownum <= MONTHS_BETWEEN(zz.e, zz.s) + 1) tt
          分析: 這個題目比較難, 因為考察了很多的Oracle特有的函數,表(視圖).

          rownum 行號
          ADD_MONTHS 日期函數,給一個日期加一個月數,得到這個月數后的日期
          to_date 日期函數, 將一個字符以一定格式轉成日期
          to_char 字符函數, 以一定格式得到字符
          last_day 日期函數, 得到某日所在月的最后一天
          MONTHS_BETWEEN 日期函數, 得到兩個日期間隔的月數
            回復  更多評論
            
          # re: oracle日期處理完全版 2010-05-14 20:35 | xzc
          select to_char(cur_month, 'MM'), cur_month, last_day(cur_month)
          from (select aa.begin_month, rownum, add_months(aa.begin_month, rownum - 1) cur_month
          from (select to_date('2008' || '12', 'YYYYMM') begin_month, to_date('2009' || '02', 'YYYYMM') end_month
          from dual) aa,
          all_objects bb
          where rownum <= months_between(aa.end_month, aa.begin_month) + 1)
            回復  更多評論
            
          # re: oracle日期處理完全版[未登錄] 2012-06-01 09:36 | xzc
          --當月的日列表
          select to_char(sysdate - rownum, 'YYYYMMDD') day_id from user_objects where rownum < to_char(sysdate, 'DD');
          --某月的日列表
          select to_char(to_date('201007', 'YYYYMM') - 1 + rownum, 'YYYYMMDD') day_id
          from user_objects
          where rownum <= to_char(last_day(to_date('201007', 'YYYYMM')), 'DD');  回復  更多評論
            
          # re: oracle日期處理完全版[未登錄] 2012-06-01 10:37 | xzc
          --周末
          select day_id, to_char(day_id, 'DAY')
          from (select to_date('201205', 'YYYYMM') - 1 + rownum day_id
          from user_objects
          where rownum <= to_char(last_day(to_date('201205', 'YYYYMM')), 'DD'))
          where to_char(day_id, 'd') in (1, 7);
          select to_char(day_id, 'YYYYMMDD')
          from (select to_date('20120526', 'YYYYMMDD') - rownum + 1 day_id
          from user_objects
          where rownum <= substr(20120526, 7, 2))
          where to_char(day_id, 'd') in (1, 7);
          --星期一~星期五
          select day_id, to_char(day_id, 'DAY')
          from (select to_date('201205', 'YYYYMM') - 1 + rownum day_id
          from user_objects
          where rownum <= to_char(last_day(to_date('201205', 'YYYYMM')), 'DD'))
          where to_char(day_id, 'd') in (2, 3, 4, 5, 6);
          select to_char(day_id, 'YYYYMMDD')
          from (select to_date('20120526', 'YYYYMMDD') - rownum + 1 day_id
          from user_objects
          where rownum <= substr(20120526, 7, 2))
          where to_char(day_id, 'd') in (2, 3, 4, 5, 6);  回復  更多評論
            
          主站蜘蛛池模板: 若尔盖县| 通山县| 介休市| 习水县| 西贡区| 个旧市| 永城市| 金湖县| 海原县| 年辖:市辖区| 大兴区| 武胜县| 大庆市| 渝中区| 辽宁省| 延川县| 赤城县| 阳东县| 清涧县| 祁连县| 东至县| 兴宁市| 绥阳县| 喜德县| 琼结县| 合阳县| 泽普县| 伊宁市| 高陵县| 营山县| 深圳市| 丰县| 洪洞县| 边坝县| 弥勒县| 南平市| 中超| 永昌县| 宁明县| 城步| 清流县|