記錄點(diǎn)滴

          BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            10 Posts :: 1 Stories :: 1 Comments :: 0 Trackbacks

          1、錯(cuò)誤原因:
          date類型不能包含秒以后的精度。
          如日期:2010-01-01 20:02:20.0

          解決方法:將日期秒以后的精度去除
          如日期:2010-01-01 20:02:20

          2、INSERT INTO TEST2 (C1, C2,c3) VALUES (${v1},${v2},to_date(${v3},'yyyy-mm-dd'));
          oracle里面不需要以“;”結(jié)尾。


          3、修改數(shù)據(jù)庫(kù)日期格式:
          alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'

          這個(gè)命令的適用范圍,是修改當(dāng)前SESSION,另外這不能修改第三方工具的日期格式,如:PL/SQL DEVELOPER需要在Tools->Preferences->User Interface->Date/Time下修改格式即可,第三方工具的日期格式在工具內(nèi)部自己去設(shè)置,我估計(jì)你也應(yīng)該在第三方工具下才會(huì)看到這樣的效果,一般默認(rèn)情況下ORACLE默認(rèn)的日期格式不是這樣的。

          在默認(rèn)的sqlplus或者sqlplusw下或者程序編寫(xiě)過(guò)程中,執(zhí)行該命令后,如果是同一個(gè)session是肯定會(huì)產(chǎn)生你要的效果。

          如果要將整體的數(shù)據(jù)庫(kù)級(jí)別默認(rèn)格式改掉需要修改參數(shù)文件,并重啟數(shù)據(jù)庫(kù)才可以,但是這個(gè)也改不掉你第三方工具的顯示格式,第三方工具只能在工具內(nèi)部去改,它只能改掉默認(rèn)的日期格式,第三方工具都是轉(zhuǎn)換后的;但是很多時(shí)候容易被工具所忽悠,給人的感覺(jué)就是數(shù)據(jù)庫(kù)就是這樣存儲(chǔ)的,其實(shí)存儲(chǔ)的只有日期格式,沒(méi)有YYYYMM這些東西,這些東西都是通過(guò)算法計(jì)算出來(lái)的結(jié)果,然后根據(jù)格式要求進(jìn)行對(duì)應(yīng)的格式化給看到的這樣的效果而已。


          4、INSERT INTO TEST2 (C1, C2,c3) VALUES ('1',1,to_date('2010-12-27 00:00:00','yyyy-mm-dd'))  不可以
          INSERT INTO TEST2 (C1, C2,c3) VALUES (1,1,to_date('2010-12-27 00:00:00','yyyy-mm-dd hh24:mi:ss'))  可以
          to_date是類型轉(zhuǎn)換,不是格式轉(zhuǎn)換,字符串和后面的格式要匹配;to_char才是轉(zhuǎn)成對(duì)應(yīng)格式;


          oracle日期格式總結(jié)在oracle中處理日期大全

          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小時(shí)格式下時(shí)間范圍為: 0:00:00 - 23:59:59....
          12小時(shí)格式下時(shí)間范圍為: 1:00:00 - 12:59:59 ....
          1.
          日期和字符轉(zhuǎn)換函數(shù)用法(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
          設(shè)置日期語(yǔ)言
          ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN';
          也可以這樣
          TO_DATE ('2002-08-26', 'YYYY-mm-dd', 'NLS_DATE_LANGUAGE = American')

          4.
          兩個(gè)日期間的天數(shù)
          select floor(sysdate - to_date('20020405','yyyymmdd')) from dual;

          5. 時(shí)間為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號(hào)中午12點(diǎn)之后和12月1號(hào)的12點(diǎn)之前是不包含在這個(gè)范圍之內(nèi)的。
          所以,當(dāng)時(shí)間需要精確的時(shí)候,覺(jué)得to_char還是必要的
          7. 日期格式?jīng)_突問(wèn)題
          輸入的格式要看你安裝的ORACLE字符集的類型, 比如: US7ASCII, date格式的類型就是: '01-Jan-01'
          alter system set NLS_DATE_LANGUAGE = American
          alter session set NLS_DATE_LANGUAGE = American
          或者在to_date中寫(xiě)
          select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual;
          注意我這只是舉了NLS_DATE_LANGUAGE,當(dāng)然還有很多,
          可查看
          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間除星期一和七的天數(shù)
          在前后分別調(diào)用DBMS_UTILITY.GET_TIME, 讓后將結(jié)果相減(得到的是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 與最后一行是一樣的
          可以建立一個(gè)函數(shù)來(lái)處理這個(gè)問(wèn)題
          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.
          獲得小時(shí)數(shù)

          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.
          處理月份天數(shù)不定的辦法
          select to_char(add_months(last_day(sysdate) +1, -2), 'yyyymmdd'),last_day(sysdate) from dual

          16.
          找出今年的天數(shù)
          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的區(qū)別
          'YYYY99 TO_C
          ------- ----
          yyyy 99 0099
          rrrr 99 1999
          yyyy 01 0001
          rrrr 01 2001

          18.不同時(shí)區(qū)的處理
          select to_char( NEW_TIME( sysdate, 'GMT','EST'), 'dd/mm/yyyy hh:mi:ss') ,sysdate
          from dual;

          19.
          5秒鐘一個(gè)間隔
          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位秒數(shù)

          20.
          一年的第幾天
          select TO_CHAR(SYSDATE,'DDD'),sysdate from dual
          310 2002-11-6 10:03:51

          21.計(jì)算小時(shí),分,秒,毫秒
          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函數(shù)
          next_day(sysdate,6)是從當(dāng)前開(kāi)始下一個(gè)星期五。后面的數(shù)字是從星期日開(kāi)始算起。
          1 2 3 4 5 6 7
          日 一 二 三 四 五 六


          oracle中有很多關(guān)于日期的函數(shù)

          在oracle中有很多關(guān)于日期的函數(shù),如:
          1、add_months()用于從一個(gè)日期值增加或減少一些月份
          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()返回當(dāng)前會(huì)放時(shí)區(qū)中的當(dāng)前日期
          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 /

          會(huì)話已更改。

          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數(shù)據(jù)類型返回當(dāng)前會(huì)放時(shí)區(qū)中的當(dāng)前日期
          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 /

          會(huì)話已更改。

          SQL> select sessiontimezone,current_timestamp from dual;

          SESSIONTIMEZONE CURRENT_TIMESTAMP
          --------------- ------------------------------------
          -11:00 12-11月-03 04.58.00.243000 下午 -11:
          00

          SQL>

          4、dbtimezone()返回時(shí)區(qū)
          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()返回包含了日期參數(shù)的月份的最后一天的日期
          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()返回會(huì)話中的日期和時(shí)間
          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';

          會(huì)話已更改。

          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()判斷兩個(gè)日期之間的月份數(shù)量
          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()給定一個(gè)日期值,返回由第二個(gè)參數(shù)指出的日子第一次出現(xiàn)在的日期值(應(yīng)返回相應(yīng)日子的名稱字符串)

          與周相關(guān)日期函數(shù)

          1.查詢某周的第一天
          select trunc(decode(ww, 53, to_date(yy || '3112', 'yyyyddmm'), to_date(yy || '-' || to_char(ww * 7), 'yyyy-ddd')), 'd') last_day
          from (select substr('2004-32', 1, 4) yy, to_number(substr('2004-32', 6)) ww
          from dual)

          select trunc(to_date(substr('2003-01',1,5)||to_char((to_number(substr('2003-01',6)))*7),'yyyy-ddd'),'d')-6 first_day from dual

          select min(v_date) from
          (select (to_date('200201','yyyymm') + rownum) v_date
          from all_tables
          where rownum < 370)
          where to_char(v_date,'yyyy-iw') = '2002-49'

          2.查詢某周的最后一天
          select trunc(decode(ww, 53, to_date(yy || '3112', 'yyyyddmm'), to_date(yy || '-' || to_char(ww * 7), 'yyyy-ddd')), 'd') - 6 first_day
          from (select substr('2004-33', 1, 4) yy, to_number(substr('2004-33', 6)) ww
          from dual)

          select trunc(to_date(substr('2003-01',1,5)||to_char((to_number(substr('2003-01',6)))*7),'yyyy-ddd'),'d') last_day from dual

          select max(v_date) from
          (select (to_date('200408','yyyymm') + rownum) v_date
          from all_tables
          where rownum < 370)
          where to_char(v_date,'yyyy-iw') = '2004-33'

          3.查詢某周的日期
          select min_date, to_char(min_date,'day') day from
          (select to_date(substr('2004-33',1,4)||'001'+rownum-1,'yyyyddd') min_date
          from all_tables
          where rownum <= decode(mod(to_number(substr('2004-33',1,4)),4),0,366,365)
          union

          select to_date(substr('2004-33',1,4)-1||
          decode(mod(to_number(substr('2004-33',1,4))-1,4),0,359,358)+rownum,'yyyyddd') min_date
          from all_tables
          where rownum <= 7
          union

          select to_date(substr('2004-33',1,4)+1||'001'+rownum-1,'yyyyddd') min_date
          from all_tables
          where rownum <= 7
          )
          where to_char(min_date,'yyyy-iw') ='2004-33'


          oracle中時(shí)間運(yùn)算

          論壇中常常看到有對(duì)oracle中時(shí)間運(yùn)算提問(wèn)的問(wèn)題,今天有時(shí)間,看了看以前各位兄弟的貼子,整理了一下,并作了個(gè)示例,希望會(huì)對(duì)大家有幫助。
          首先感謝ern、eric.li及各版主還有熱心的兄弟們

          內(nèi)容如下:
          1、oracle支持對(duì)日期進(jìn)行運(yùn)算
          2、日期運(yùn)算時(shí)是以天為單位進(jìn)行的
          3、當(dāng)需要以分秒等更小的單位算值時(shí),按時(shí)間進(jìn)制進(jìn)行轉(zhuǎn)換即可
          4、進(jìn)行時(shí)間進(jìn)制轉(zhuǎn)換時(shí)注意加括號(hào)(見(jiàn)示例中紅色括號(hào)),否則會(huì)出問(wèn)題

          SQL> alter session set nls_date_format='yyyy-mm-dd hh:mi:ss';

          會(huì)話已更改。

          SQL> set serverout on
          SQL> declare
          2 DateValue date;
          3 begin
          4 select sysdate into DateValue from dual;
          5 dbms_output.put_line('源時(shí)間:'||to_char(DateValue));
          6 dbms_output.put_line('源時(shí)間減1天:'||to_char(DateValue-1));
          7 dbms_output.put_line('源時(shí)間減1天1小時(shí):'||to_char(DateValue-1-1/24));
          8 dbms_output.put_line('源時(shí)間減1天1小時(shí)1分:'||to_char(DateValue-1-1/24-1/(24*60)));
          9 dbms_output.put_line('源時(shí)間減1天1小時(shí)1分1秒:'||to_char(DateValue-1-1/24-1/(24*60)-1/(24*60*6
          0)));
          10 end;
          11 /
          源時(shí)間:2003-12-29 11:53:41
          源時(shí)間減1天:2003-12-28 11:53:41
          源時(shí)間減1天1小時(shí):2003-12-28 10:53:41
          源時(shí)間減1天1小時(shí)1分:2003-12-28 10:52:41
          源時(shí)間減1天1小時(shí)1分1秒:2003-12-28 10:52:40

          PL/SQL 過(guò)程已成功完成。

           

          posted on 2012-05-03 17:41 liuliang 閱讀(108328) 評(píng)論(0)  編輯  收藏 所屬分類: oracle

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 江达县| 石泉县| 霍林郭勒市| 蒙山县| 密山市| 南通市| 额济纳旗| 邢台县| 昌都县| 横峰县| 晋州市| 南雄市| 永定县| 宣威市| 繁昌县| 安图县| 湘乡市| 乐亭县| 五河县| 达州市| 康保县| 长葛市| 丰顺县| 西充县| 揭东县| 留坝县| 梁河县| 温宿县| 富蕴县| 延长县| 玉屏| 临泽县| 堆龙德庆县| 新巴尔虎左旗| 淮北市| 乌兰察布市| 保亭| 若尔盖县| 永川市| 平远县| 金华市|