很实用的时间处理知识点。
DI2rkD#Dj\f24513607 [,w*U)S+G1NO24513607举例说明: U!w2Wb+mBc245136071、日期字符转换函数to_date(),to_char() J7Y"Mp8g`/L X24513607 SQL:select to_date('20080229132545','yyyy-mm-dd hh24:mi:ss') from dual ; RESULT:2008-2-29 13:25:45 RXx},GR+ZP?x(G24513607 SQL:select to_char(sysdate,'hh:mi:ss') TIME from dual; RESULT:10:51:43 %i\*qh"t^fs245136072、ITPUB个人空间 eIY7j9B~ SQL:select to_char( to_date(2008,'J'),'Jsp') from dual; RESULT:Two Thousand Eight 5hc$J"I I0h*h!@[v245136073、查看哪天的年份 i*J-Q{-W7Q)|(M+H24513607 SQL:select to_char(to_date('2008-2-29','yyyy-mm-dd'),'year') from dual; RESULT:two thousand eightITPUB个人空间Q)]`rzU%dbqNUP SQL:select to_char(to_date('2008-2-29','yyyy-mm-dd'),'yyyy') from dual; RESULT:2008ITPUB个人空间j9V2xJo*Z*Tb4H U 4、查看哪天的月份ITPUB个人空间?K%GO*YR3o,` SQL:select to_char(to_date('2008-2-29','yyyy-mm-dd'),'month') from dual;RESULT:2月ITPUB个人空间;i%o^8iE}#g_ SQL:select to_char(to_date('2008-2-29','yyyy-mm-dd'),'mm') from dual; RESULT:02ITPUB个人空间&o-QVq'L 5、查看哪天是星期几ITPUB个人空间N0`9IK p SQL:select to_char(to_date('2008-2-29','yyyy-mm-dd'),'day') from dual; RESULT:星期五ITPUB个人空间E%r'A0h,f ^ D+S SQL:select to_char(to_date('2008-02-29','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual;ITPUB个人空间#T,WXj$@ ]4X-g RESULT:friday j$o-AfC&}24513607 SQL:select to_char(to_date('2008-2-29','yyyy-mm-dd'),'dd') from dual;RESULT:29 I.x J-G,uK E0L'X#u3S245136076、查看两个日期之间的天数 1NDM!s4L,i[ E24513607 SQL:select floor(sysdate - to_date('20080201','yyyymmdd')) from dual; RESULT:28ITPUB个人空间LR$mo$`3[w l 注:sysdate是2008-02-29ITPUB个人空间,jlp@M_SAwO0z 7、取两个日期之间除了周六周日的天数ITPUB个人空间M+{l5c\Ds*P SQL:ITPUB个人空间a^L9v/@I select count(*)ITPUB个人空间"g\6Q%iT4rUk from ( select rownum-1 rnumITPUB个人空间|}+^&G{N/F1\/c?$[yh from all_objects MGPVS$K%w24513607 where rownum <= to_date('2008-02-29','yyyy-mm-dd') - to_date('2008- (vH4UVPM24513607 02-01','yyyy-mm-dd')+1ITPUB个人空间G/bWz Z7_z'fV E )ITPUB个人空间2_&sl9a.ban,L } where to_char( to_date('2008-02-01','yyyy-mm-dd')+rnum-1, 'D' )ITPUB个人空间)vD&r&a!y~%qM notITPUB个人空间:| Ajy(F:q in ( '6', '7' ) 0T'Tw-s^ ] k.Y24513607 RESULT:ITPUB个人空间~1ca(Z"N,@ W'[g+d 21 Jt1a ~r#d]8E udo245136078、查看两个日期之间的月数 G*D"LYl6k7` E24513607 SQL:select months_between(to_date('2-29-2008', 'MM-DD-YYYY'),to_date('10-1-2007', 'MM-DD-YYYY')) "MONTHS" FROM DUAL;ITPUB个人空间 `1Q+iz1F1L/? RESULT:4.90322580645161ITPUB个人空间 ^Q [B.z\!K P K,T%z 9、next_day函数ITPUB个人空间8H+W/z,S#u-BCX next_day(sysdate,6)是从当前开始下一个星期五。后面的数字是从星期日开始算起。 [!ty@$qlk,y24513607 1 2 3 4 5 6 7 2x7{k_;^] }+|6T24513607 日 一 二 三 四 五 六ITPUB个人空间.^a,l0R i;N+pY 10、查看小时分秒 1u2i#I8ae)k5k24513607 select sysdate ,to_char(sysdate,'hh') from dual; *\/]C1|{;Wt$hYQ24513607 select sysdate ,to_char(sysdate,'mi') from dual; y,F;^bA)V*a24513607 select sysdate ,to_char(sysdate,'ss') from dual;ITPUB个人空间1b E`0^ }X!A 11、取一年的天数(例如今年2008) "i[3WY#v$ba24513607 SQL:select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual ;RESULT:366 lb4X_NZ2451360712、 yyyy与rrrr的区别ITPUB个人空间n+J5B4k%t*j7q+W yyyy 99 0099 7OV'A1{G!emM24513607 rrrr 99 1999ITPUB个人空间F4v8js m X%QF yyyy 01 0001ITPUB个人空间 rDAE!bEzNgq rrrr 01 2001 V9b Du2\u)sn8f7q7Y$`2451360713、一年的第几天ITPUB个人空间w^,a~0mO(a2n~O SQL:select TO_CHAR(SYSDATE,'DDD'),sysdate from dual ;RESULT:060ITPUB个人空间`o|}#X!oA7H 注:sysdate是2008-02-29ITPUB个人空间gE? F4wZ;Xb7X 14、add_months()用于从一个日期值增加或减少一些月份ITPUB个人空间LT#z6i e t SQL:select add_months(sysdate,12) from dual; RESULT:2009-2-28 11:23:50 ,R$A!G"eZU,Sc%`G v2451360715、extract()找出日期或间隔值的字段值 ^#bJn T cR24513607 SQL:select extract(month from sysdate) from dual; RESULT:2 0i7HW[!]_*W*K?v24513607 SQL:select extract(year from add_months(sysdate,36)) from dual; RESULT:2011ITPUB个人空间Pa't&u P?'}| 16、last_day()返回包含了日期参数的月份的最后一天的日期 rCGH1l1z)cO!I24513607 SQL:select last_day(sysdate) from dual; RESULT:2008-2-29ITPUB个人空间5g#nrxy |9Ve P[1J5e9d"~{NS24513607 ITPUB个人空间.HN]H.Qe|4N ITPUB个人空间/zM)RP;wn"M~T ===================================================================================================================ITPUB个人空间BY.L0X*Z~KU#\? 6O3Y8~P/o~bc24513607TO_DATE格式 OQl,@RYl#cj24513607 Day: _gIhi'An0fP24513607 dd number 12 f&x+W'X#[\_24513607 dy abbreviated fri (MV.ev*] _\+t24513607 day spelled out friday ITPUB个人空间3c9R6\a$s ddspth spelled out, ordinal twelfthITPUB个人空间9Owi^7}1}zu d Month: ITPUB个人空间qy-m} mt+}+v mm number 03ITPUB个人空间/tQ4qgKop'ba ~ mon abbreviated marITPUB个人空间4q,kOC s G,pt Z nF month spelled out march "H {5Y W'M2N |O24513607 Year: N1e.N"Wa3uYxSy24513607 yy two digits 98ITPUB个人空间?iw1P'C9?Ye b yyyy four digits 1998 ITPUB个人空间%CM.nl#OR4Q +Fl:G-R NU-c24513607 24小时格式下时间范围为: 0:00:00 - 23:59:59....ITPUB个人空间Jv)TG^y'd@ 12小时格式下时间范围为: 1:00:00 - 12:59:59 .... 5CQ D5dc1Nl9}8}245136071. )J&@o v/kXF;T24513607 日期和字符转换函数用法(to_date,to_char) )BN8p+v%x4i?24513607 ITPUB个人空间 Xd'GA+r*Y 2.ITPUB个人空间R"n0S@]j H select to_char( to_date(222,'J'),'Jsp') from dual +^w3N*f6kP24513607 9P%zjUSn3[On4d8h24513607 显示Two Hundred Twenty-Two -^Jj9?"wnK`}24513607 ({3rz9_aw/Z&U0J f v `245136073.求某天是星期几ITPUB个人空间uNE`3EVA![ select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day') from dual; ITPUB个人空间W@[so%d 星期一 ~S#u'AP.b*D0RdA24513607 select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual; ITPUB个人空间"p_yYp){f'Z4L monday ?a_/^0xvl(U24513607 设置日期语言ITPUB个人空间8V~FY,RB-d[ ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN'; !P6y*k&q%Y!]ew1dU24513607 也可以这样 kM#K7VSh uF24513607 TO_DATE ('2002-08-26', 'YYYY-mm-dd', 'NLS_DATE_LANGUAGE = American') 2t5i2`(aH24513607 nx%B/Wm~ N245136074.两个日期间的天数ITPUB个人空间wMp!Zv select floor(sysdate - to_date('20020405','yyyymmdd')) from dual;ITPUB个人空间5H?j g_?&| ITPUB个人空间0]0u@"o-G 5. 时间为null的用法 YQ'@1N?{YcT24513607 select id, active_date from table1ITPUB个人空间P&qA\ ]J0t UNIONITPUB个人空间I {d"l1J select 1, TO_DATE(null) from dual;ITPUB个人空间/R!PI1CTul3v"xh ITPUB个人空间,~w2gqJ:W}/Hc? 注意要用TO_DATE(null) :o.J| u$} _a$y6e\x24513607 ITPUB个人空间P Y `%sa#O 6. |l:Y"q%P1]/WK24513607 a_date between to_date('20011201','yyyymmdd') and to_date('20011231','yyyymmdd') 1Mr _'c%iIf24513607 那么12月31号中午12点之后和12月1号的12点之前是不包含在这个范围之内的。ITPUB个人空间QWyZt:X"O@5R 所以,当时间需要精确的时候,觉得to_char还是必要的 9L s2vhi245136077. 日期格式冲突问题ITPUB个人空间G ~_'Sll7n(V3^)O2B ~ 输入的格式要看你安装的ORACLE字符集的类型, 比如: US7ASCII, date格式的类型就是: '01-Jan-01'ITPUB个人空间Pg'W)g/Im alter system set NLS_DATE_LANGUAGE = AmericanITPUB个人空间Y[2R!o1_7|4d{ alter session set NLS_DATE_LANGUAGE = AmericanITPUB个人空间#]o2_X3e`+e G:WO 或者在to_date中写ITPUB个人空间(Bp]Uh.V*PQ select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual; p1G0HB,{1x+y${24513607 注意我这只是举了NLS_DATE_LANGUAGE,当然还有很多, 5j'oqX9IB24513607 可查看ITPUB个人空间6q(v&Kd|g [s*O select * from nls_session_parametersITPUB个人空间9FrB6~\*v select * from V$NLS_PARAMETERSITPUB个人空间(~OQ hT.oB )B}6dN4bVK24513607 日期和字符转换函数用法(to_date,to_char) 'O ne kqVKAS\24513607 We overwrite NLS_DATE_FORMAT into different formats for the session. ITPUB个人空间$F lr8WX.sFq8^z sql> alter session set nls_date_format = 'DD-MON-RR'; Session altered. j%z[f+y ~M24513607 sql> set pagesize 0ITPUB个人空间8s1A8d c8@(C|U-u m sql> set linesize 130 I5M_F[!p24513607 sql> select * from nls_session_parameters; Yp@0q'U"v!?f24513607 NLS_LANGUAGE AMERICANITPUB个人空间J(yb'B`"A1X h NLS_TERRITORY AMERICAITPUB个人空间%o"i ]|D(w&l.R-e NLS_CURRENCY $ITPUB个人空间`L9\Bb NLS_ISO_CURRENCY AMERICAITPUB个人空间&X/T$XX]/{u{ NLS_NUMERIC_CHARACTERS ., IB?L&EkF o4Y6j/{24513607 NLS_CALENDAR GREGORIAN Q%\8mbS24513607 NLS_DATE_FORMAT DD-MON-RRITPUB个人空间Se#l$E(L$qh7H4x NLS_DATE_LANGUAGE AMERICAN O\.?I ek5f W24513607 NLS_SORT BINARY 1Z!_"jB|24513607 NLS_TIME_FORMAT HH.MI.SSXFF AMITPUB个人空间%u/^#p5jB3C9X)? NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM 0G'^P dat8S24513607 NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZH:TZM @o"XE k6`~1e24513607 NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZH:TZMITPUB个人空间q|;M-R`l.oY+RM NLS_DUAL_CURRENCY $ITPUB个人空间;~O)E|*?T&Cy NLS_COMP BINARY S#l.x#ok.f9}24513607ITPUB个人空间KZ0H~d 15 rows selected.ITPUB个人空间"r{/o1f mMY specify it in sql statement:ITPUB个人空间pyn(q"U!i)i}9fmt E Th0V4I%P)B3|(C&R24513607 sql> select to_date('03-SEP-1999','DD-MON-YYYY') from dual; C2u5g;G/XA/u"Z%w(p24513607 03-SEP-99 @|)gU_ly#RR4z24513607 sql> alter session set nls_date_format = 'MM-DD-YYYY';ITPUB个人空间T{N WBA u Session altered.ITPUB个人空间b*[%a@[1L"D7c ITPUB个人空间:dHk^6d rWB sql> select to_date('03-SEP-99','DD-MON-YY') from dual; jY)g8W s Y24513607 TO_DATE('0ITPUB个人空间"c!c!KCxF&{z ---------- &^DZ h+q[24513607 09-03-1999 )Yu__I^24513607 sql> alter session set nls_date_format = 'RRRR-MM-DD';ITPUB个人空间 Rh"jX-S Session altered. ITPUB个人空间i$A G$cF3Q b)W(R ITPUB个人空间@ \lK$h4LRR sql> select to_date('03-SEP-1999','DD-MON-YYYY') from dual;ITPUB个人空间{$vAI)pS TO_DATE('0ITPUB个人空间:j*{&W K jI&g ----------ITPUB个人空间+k"h3?NW;WbO 1999-09-03 ITPUB个人空间 Ux j b.j;S Y ITPUB个人空间5nhFqo$? pk'U When we use TO_CHAR function, we get expected results of format from current sql statement: ITPUB个人空间j8S~/C bO.^Y sql> alter session set nls_date_format = 'MM-DD-YY';ITPUB个人空间$W V(LoB%M3ZB Session altered. ^*H&N(wM[d:c-s24513607 sql> select to_char(sysdate,'dd-mm-yyyy') from dual;ITPUB个人空间V5vD)s)z TO_CHAR(SYSDATE,'DD-MM-YYYY') ITPUB个人空间F"g.r:m S f4D] 07-09-1999 ITPUB个人空间,[BP,}#PR sql> alter session set nls_date_format = 'RR-MON-DD'; 2n2|^$y;O2S2? H h24513607 Session altered. *Fr3C.W&pqK7i;g4P24513607 sql> select to_char(sysdate,'dd-mon-yy') from dual;ITPUB个人空间 O/R&F `8\ Efz TO_CHAR(SYSDATE,'DD-MON-YY') +f\6|e4p3i&`6`,H'T24513607 07-sep-99 ITPUB个人空间Y s l [#l`;@ sql> select to_char(sysdate,'dd-Mon-yy') from dual; PhA,{0H3smBj0Z24513607 TO_CHAR(SYSDATE,'DD-MON-YY') a.U UG2G:s uC*x24513607 07-Sep-99 3_8le,|5j_c245136078.ITPUB个人空间x y#hZ!vT+@J_$r select count(*) ITPUB个人空间0iE;]~!U&Y from ( select rownum-1 rnum ITPUB个人空间y0T3\%JG from all_objects ITPUB个人空间jqV"Kb0S4] where rownum <= to_date('2002-02-28','yyyy-mm-dd') - to_date('2002- I5X#s^Kb!Q i-P24513607 02-01','yyyy-mm-dd')+1 Ye;R)N$c)E24513607 ) ITPUB个人空间o9[0B%g{gf'` where to_char( to_date('2002-02-01','yyyy-mm-dd')+rnum-1, 'D' )ITPUB个人空间$fJ wg]2a}d not A/o G i&Y*JK0K24513607 in ( '1', '7' ) ,^KU*m*r3Cy v,k24513607 ITPUB个人空间{VVM+z3`)S 查找2002-02-28至2002-02-01间除星期一和七的天数ITPUB个人空间d7C$u,AX@%q4r 在前后分别调用DBMS_UTILITY.GET_TIME, 让后将结果相减(得到的是1/100秒, 而不是毫秒). +f)ew8dU b24513607 ITPUB个人空间(T_o C$[;V0{H 9.ITPUB个人空间.] a:Vc!ez SFPd select months_between(to_date('01-31-1999','MM-DD-YYYY'), 0~AB3g+vW2R,J:BZ1k/h24513607 to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL; ITPUB个人空间 u g+r&t&y}#s6m] 1 R ?FyAy24513607 ITPUB个人空间DO)n%zaG va select months_between(to_date('02-01-1999','MM-DD-YYYY'), ITPUB个人空间MS t PFA to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL; ITPUB个人空间*A1rj w8wzH&C~1x ITPUB个人空间9g n nH\WL(Q o} 1.03225806451613ITPUB个人空间P-p _F{Or-} 10. Next_day的用法ITPUB个人空间!M:g GTSd q Next_day(date, day) ;O wGo7U"}24513607 +CK5n4L_ Bp24513607 Monday-Sunday, for format code DAY ITPUB个人空间S ZE7d rr Mon-Sun, for format code DY ITPUB个人空间2cW9oSQ{ L1z.J 1-7, for format code D .\TG2M\0Q24513607 g;g7x'w] ud2451360711 GHVH*V[/f24513607 select to_char(sysdate,'hh:mi:ss') TIME from all_objectsITPUB个人空间5`-RSLHm8` {;v 注意:第一条记录的TIME 与最后一行是一样的ITPUB个人空间0T0d-XSY"ZuKc 可以建立一个函数来处理这个问题ITPUB个人空间\vc3pkr2ad2C9x'r2_ create or replace function sys_date return date is lg'`T ~f(KSn1{0M24513607 begin ITPUB个人空间!t!x;?g K-VFj$q9y RI8` return sysdate; ITPUB个人空间 jQ?9H N end; ITPUB个人空间R-T)M8aHn OoM9UP v&lm"DP1P24513607 select to_char(sys_date,'hh:mi:ss') from all_objects; ITPUB个人空间J6{|:r)Twb 12. $EG8Bj8Md24513607 获得小时数ITPUB个人空间v8r}4sn0t$Y@ $T!E_]4@W4S2L;s24513607 SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 2:38:40') from offerITPUB个人空间7o|w.n,Z!v+k sql> select sysdate ,to_char(sysdate,'hh') from dual; &U Q1r5B$mJ:l24513607 ITPUB个人空间A F?|0g?1J4~ SYSDATE TO_CHAR(SYSDATE,'HH') N_ fr:m2@c9a24513607 -------------------- --------------------- }2|i|N2W"V@24513607 2003-10-13 19:35:21 07 ac(Bj/q2@'c?24513607 ITPUB个人空间;t$?8VizOH-T/Y sql> select sysdate ,to_char(sysdate,'hh24') from dual;ITPUB个人空间;v(L0ba4ms0s n3n9^2l W3ed24513607 SYSDATE TO_CHAR(SYSDATE,'HH24') 1N`[(?&F}6YCo b24513607 -------------------- ----------------------- 5X ne0L-M}24513607 2003-10-13 19:35:21 19ITPUB个人空间0n,Zw8Mv ITPUB个人空间F7w [.PmOD 获取年月日与此类似 .i7[ n6I9O2m9c,b K2451360713.ITPUB个人空间J-`_g#` 年月日的处理ITPUB个人空间4} PP3vz z3x select older_date, NG3E L"x sl.W24513607 newer_date,ITPUB个人空间-gS5SbAt"~ years,ITPUB个人空间vkO3YoH-Hd months,ITPUB个人空间X LAx aW%s9x abs(ITPUB个人空间QXRX1@RP(wy trunc( l-M8SXU^2}24513607 newer_date- w:S5t+tE0s24513607 add_months( older_date,years*12+months )ITPUB个人空间*Y)o.g M4{{ ) &N`/g i!LN8rP bA24513607 ) days $vb%Ju#}*S4O m24513607 from ( select *p6c`2C[24513607 trunc(months_between( newer_date, older_date )/12) YEARS, t)qQhSZk-E24513607 mod(trunc(months_between( newer_date, older_date )), a(pOX!i!sv(n Pt24513607 12 ) MONTHS,ITPUB个人空间1BK0rl}:HF F newer_date, Lo,W] ~ W^24513607 older_date Xx:M|Y#j*X24513607 from ( select hiredate older_date, ]U L#b&@;l24513607 add_months(hiredate,rownum)+rownum newer_dateITPUB个人空间z%M g5b6]:] from emp ) /L"DbA.]%a5D$R4N_24513607 )ITPUB个人空间OC3Cp0I1Wg Zp H t2gK[2QO/O#Bvq2451360714. -M(}#a r)u Q(s1u24513607 处理月份天数不定的办法 3N g[J&^ @7n1j.C-D_24513607 select to_char(add_months(last_day(sysdate) +1, -2), 'yyyymmdd'),last_day(sysdate) from dualITPUB个人空间B\~4l9_8B%xo F ITPUB个人空间.s1[go#S[fx 16.ITPUB个人空间[Am"AP(V(H 找出今年的天数 Spw Oo\t24513607 select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dualITPUB个人空间in\G E"X A 6y*@r(u1x ~24513607 闰年的处理方法 AI:I+?1f2i1D%D24513607 to_char( last_day( to_date('02' || :year,'mmyyyy') ), 'dd' ) {n I4B1d#ZT/F24513607 如果是28就不是闰年 (jE,h&Hq2e1J-e Y24513607 ITPUB个人空间+z/D4lW.Y*{ 17. Wp&s2[&Y!|i9uB24513607 yyyy与rrrr的区别ITPUB个人空间~hT$|u4Y%} 'YYYY99 TO_C (N&g;I$](bV24513607 ------- ---- '|J6f4uT,Hw24513607 yyyy 99 0099 n)MEx.K'L C.c v.q24513607 rrrr 99 1999ITPUB个人空间:]%X6tp,MK!z yyyy 01 0001 *DJ G a;t&h24513607 rrrr 01 2001 N&d*} W0A:}Fjz24513607 a2l,H)F)|2451360718.不同时区的处理ITPUB个人空间/F"}4hR7V&r,C\)?(F"O select to_char( NEW_TIME( sysdate, 'GMT','EST'), 'dd/mm/yyyy hh:mi:ss') ,sysdate 9tBPQ,y;e7M9`&~H24513607 from dual; 9Q:z_1D0H'Z24513607 ITPUB个人空间%c%\lH/oU)i-K@9d 19. *vW:P8L$Q IH2x24513607 5秒钟一个间隔 \Y"@1J_*I3a!q24513607 Select TO_DATE(FLOOR(TO_CHAR(sysdate,'SSSSS')/300) * 300,'SSSSS') ,TO_CHAR(sysdate,'SSSSS')ITPUB个人空间s ~V {!YH from dual bqAL/s6V~24513607 ;]E6Cl6g J2eD24513607 2002-11-1 9:55:00 35786ITPUB个人空间 D&\ r/N)JWL SSSSS表示5位秒数 ~^(V,n-Uo!C24513607 )w;KQ$R&r1R2451360720.ITPUB个人空间'Nf IOu+z@ A 一年的第几天 V&]o,m:D"oe^24513607 select TO_CHAR(SYSDATE,'DDD'),sysdate from dual ITPUB个人空间u9s.a k| 310 2002-11-6 10:03:51ITPUB个人空间.IYu1S!a ITPUB个人空间 a/`v9Om 21.计算小时,分,秒,毫秒ITPUB个人空间n%E2vf km3^)F)J selectITPUB个人空间Mw s+N7HZ;B*{VZ Days,ITPUB个人空间)nsd.}}soB[+w A,ITPUB个人空间9]N3TQO.B0Of:b TRUNC(A*24) Hours, ?A8FTQZ t&B24513607 TRUNC(A*24*60 - 60*TRUNC(A*24)) Minutes, b+Z X&|QnU3hx24513607 TRUNC(A*24*60*60 - 60*TRUNC(A*24*60)) Seconds,ITPUB个人空间n#@3l\W!J TRUNC(A*24*60*60*100 - 100*TRUNC(A*24*60*60)) mSecondsITPUB个人空间 z8Gq UV^Jr7oD from [,j[+mr*b,|)`6XNP24513607 ( A-M$?X^&gK-z3?24513607 select L6T:N e V/? u }Y)@24513607 trunc(sysdate) Days,ITPUB个人空间 g#PSY$x$J5f{3~N sysdate - trunc(sysdate) AITPUB个人空间 [YZuuz%g from dualITPUB个人空间Hv ~/H,oy^sN )ITPUB个人空间B$U|.l2{4] K ITPUB个人空间]&Qf;po hU%f%g6@O :bz\f-Lbnu245136079i以上版本 Qlp,YoG24513607 -----------------------------ITPUB个人空间P;}1t F9uj sql>select to_char(systimestamp,'yyyy-mm-dd hh24:mi:ssxff') time1,ITPUB个人空间Q+lY a$k to_char(current_timestamp) time2 from dual; @;Zj\.r;X24513607 ITPUB个人空间X$ol[/QD _O TIME1 TIME2ITPUB个人空间1\ c,c/e&a-@3a ----------------------------- ---------------------------------------------------------------- n!bnk+W jYb?@h24513607 2003-10-24 10:48:45.656000 24-OCT-03 10.48.45.656000 AM +08:00 NcSYQ6Y&L:In24513607 可以看到,毫秒在to_char中对应的是FF。 2Z0`G9P\ Pu24513607 ITPUB个人空间/S_(nZKMt%nv sql> select to_timestamp('2003-10-24 10:48:45.656000','yyyy-mm-dd hh24:mi:ssxff') from dual;ITPUB个人空间N/XV*{v$N e ITPUB个人空间E U.u*~$x] TO_TIMESTAMP('2003-10-2410:48:ITPUB个人空间.[2pd~S;M;V#a -------------------------------------------------ITPUB个人空间roYt P2__ 24-10月-03 10.48.45.656000000 上午ITPUB个人空间;\j6smT,gWx*O^ ITPUB个人空间Fo/g^"V/P~3_ 22. 8b @ OL n[zP p24513607floor((date2-date1) /365) 作为年 g&EF0X iU24513607floor((date2-date1, 365) /30) 作为月 1s,SEwx8y:[|+f|)wB24513607mod(mod(date2-date1, 365), 30)作为日.ITPUB个人空间.u1f$vvb8zf 23.next_day函数 2`x)`1r5Ce7a24513607next_day(sysdate,6) 是从当前开始下一个星期五。后面的数字是从星期日开始算起。 ITPUB个人空间5hrymA@ 1 2 3 4 5 6 7 ITPUB个人空间&X4K}'sgsk 日 一 二 三 四 五 六 ITPUB个人空间L:D"}H0Su1v-Jc.N ITPUB个人空间m3@.?0t/E;k)x 24.取出一个时间段中星期日星期六的天数ITPUB个人空间eEKa_8Fn function weekends( p_date1 in date, p_date2 in date ) 'j|9G(?c1[5F_24513607return number \'qO2a ukx0Q24513607as (~'Fk4l Q5F0p)Y&j24513607 l_date1 date default least(p_date1,p_date2); [h@WRd/TQWVX7M24513607 l_date2 date default greatest(p_date1,p_date2);ITPUB个人空间TkxFO6{p.P5G!Z l_days number default trunc(l_date2-l_date1)+1; %z,? Ey"b24513607 l_cnt number;ITPUB个人空间 T E9f-Vn*p O` beginITPUB个人空间_)SHXD%m select count(*) into l_cntITPUB个人空间3|$V8~S1^8c2^ from (select rownum r s]zg/ID24513607 from all_objects where rownum <= l_days) G+}iS{xfFr:s24513607 where to_char(l_date1+r-1,'dy') in ( 'sat','sun' ); GK4RK pVW24513607 /mq&W'Y*vL'N24513607 return l_cnt;ITPUB个人空间:p!ggJ |+{\I;Dz7X end;O &?$IIc3x@.u@-]n24513607 hY4R#NB!Q1K24513607ITPUB个人空间H"NN-`HA X8Cl q,\i&V5Z)n`X24513607ITPUB个人空间*q(v~zF ITPUB个人空间7K"Xv:l.v[5U j ,P,H;IH'UB-@2}(r.d-W i24513607ORACLE日期时间函数大全 vkZ%]'u` rudY24513607ITPUB个人空间2H8a3hl:Lw2E6y.h TO_DATE格式(以时间:2007-11-02 13:45:25为例) (T$C+?!V]F(d2v0_$]24513607 o [f/j#r8y`24513607 Year: doM,Snx24513607 yy two digits 两位年 显示值:07 /?'c4Q2u5L*zQKK24513607 yyy three digits 三位年 显示值:007ITPUB个人空间`.y1R:i;ZVb!M+J|q1F yyyy four digits 四位年 显示值:2007ITPUB个人空间8Iqs dHz!N6|&F1y ] !m5K T abO24513607 Month: PR(xnUc5l e24513607 mm number 两位月 显示值:11ITPUB个人空间)Hgko[!^u mon abbreviated 字符集表示 显示值:11月,若是英文版,显示nov ITPUB个人空间d)Rl&S3` lK month spelled out 字符集表示 显示值:11月,若是英文版,显示november f$R,jD/S%Oc24513607 ITPUB个人空间 l(jOa:J0Pd2t`:a Day: 4g7O8LCr7d24513607 dd number 当月第几天 显示值:02 %w!}?~/y"t2jt24513607 ddd number 当年第几天 显示值:02ITPUB个人空间B$B/jM^5s] dy abbreviated 当周第几天简写 显示值:星期五,若是英文版,显示fri .t%Ogc/T(dy&`24513607 day spelled out 当周第几天全写 显示值:星期五,若是英文版,显示friday 1C*a3M8C"Ne fj24513607 ddspth spelled out, ordinal twelfth R Q'L;p&]-u0Kk24513607 j.uF)Y$w5Z1I*E24513607 Hour:ITPUB个人空间*~!W#t#u W1B/O hh two digits 12小时进制 显示值:01 Aw^]#D,_24513607 hh24 two digits 24小时进制 显示值:13ITPUB个人空间Zva8D3M8@ ITPUB个人空间3Ab^`9k(_7~5M Minute: BNX`a]{,X24513607 mi two digits 60进制 显示值:45 r(J$DeR&o&@ E9`/t24513607 ITPUB个人空间'hWM X%V:h9v.[F Second: B;JT4l%Zlu24513607 ss two digits 60进制 显示值:25ITPUB个人空间$`3[8|9Q$YHvn"\6z 'ATHe KN|_;m24513607 其它ITPUB个人空间 PWil JD7` Q digit 季度 显示值:4ITPUB个人空间*uEBt xS[/P9{ WW digit 当年第几周 显示值:44ITPUB个人空间#n0z3M0zLc.E W digit 当月第几周 显示值:1 dg8}Y8e*r$c)w24513607 +@*Ooo2oz6z\"p)W24513607 24小时格式下时间范围为: 0:00:00 - 23:59:59.... ITPUB个人空间z|1V"QB R/U 12小时格式下时间范围为: 1:00:00 - 12:59:59 .... &[2z0H5h5S1R4Hr24513607 ITPUB个人空间5VW5[|lM 1. 日期和字符转换函数用法(to_date,to_char)ITPUB个人空间A+D6a;@s0|(q(O ITPUB个人空间#Q5|9~UTr m$l select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') as nowTime from dual; //日期转化为字符串 ITPUB个人空间3[9y0bLl ymA'mZm^ select to_char(sysdate,'yyyy') as nowYear from dual; //获取时间的年 ITPUB个人空间S%UE8b z j select to_char(sysdate,'mm') as nowMonth from dual; //获取时间的月 ITPUB个人空间y5a"{a(I5Q select to_char(sysdate,'dd') as nowDay from dual; //获取时间的日 A8X@$ru5[24513607select to_char(sysdate,'hh24') as nowHour from dual; //获取时间的时 N,L1|E6Q.Po2v24513607select to_char(sysdate,'mi') as nowMinute from dual; //获取时间的分 yg P;Ad24513607select to_char(sysdate,'ss') as nowSecond from dual; //获取时间的秒ITPUB个人空间/N#Y\bL(C"m ITPUB个人空间#O5Y2Cx!rtH5T b m X&mx n$ux24513607select to_date('2004-05-07 13:23:44','yyyy-mm-dd hh24:mi:ss') from dual// s-y!ji?`*a24513607ITPUB个人空间k H%R,plM0\ 2. ITPUB个人空间Tg1RLe8M select to_char( to_date(222,'J'),'Jsp') from dual ITPUB个人空间2Dw'qF~7o$~z3v?/J9D ITPUB个人空间hM%p%qO6[\!z s 显示Two Hundred Twenty-Two ITPUB个人空间 a^ja+|V1nA P} ITPUB个人空间Gx1U;s2]-\;o9[ 3.求某天是星期几 :lnM jn[Y0F'FWed24513607 select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day') from dual; ITPUB个人空间OV-d@oG+|9Pc 星期一 l)|4P)s J;TwWfQ]24513607 select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual; ITPUB个人空间#a-TK4a$e"R*}hk monday | ~ x(fPjC.U24513607 设置日期语言 ITPUB个人空间 f$dO~W+y ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN'; ITPUB个人空间NT0C'Q.FJ1Y 也可以这样 4JF$}2Y#Y3W X24513607 TO_DATE ('2002-08-26', 'YYYY-mm-dd', 'NLS_DATE_LANGUAGE = American') ITPUB个人空间?'@!\nYr \'h _#E%O:yo \9r i245136074. 两个日期间的天数 ITPUB个人空间 ?1y-fS(plw%ZAJR[.? select floor(sysdate - to_date('20020405','yyyymmdd')) from dual; ITPUB个人空间*ob3d/Hy/X]`+Z ITPUB个人空间6lO?f5A#e5It S 5. 时间为null的用法 d6?0Js5sU)zK24513607 select id, active_date from table1 ^1fdczv6|wh-MD24513607 UNION Z0M2m2fwrI24513607 select 1, TO_DATE(null) from dual; v2eChF1aD)w24513607 #v RL WX E lqm24513607 注意要用TO_DATE(null) ITPUB个人空间4v r&th2z ^%| ITPUB个人空间)@/ceYH 6.月份差 \ Y!Av jp [24513607 a_date between to_date('20011201','yyyymmdd') and to_date('20011231','yyyymmdd') P)UDunwde24513607 那么12月31号中午12点之后和12月1号的12点之前是不包含在这个范围之内的。 1d k'fFWwFXbNy24513607 所以,当时间需要精确的时候,觉得to_char还是必要的 M/msH1^Ne8j@0s!O24513607 ITPUB个人空间-])J yC`%A 7. 日期格式冲突问题 ITPUB个人空间 d9U+~dr:A 输入的格式要看你安装的ORACLE字符集的类型, 比如: US7ASCII, date格式的类型就是: '01-Jan-01' 6Jd(bd(]'lx f E24513607 alter system set NLS_DATE_LANGUAGE = American ITPUB个人空间\ oJIX6nx alter session set NLS_DATE_LANGUAGE = American 0W'}C(Fmg._7O_5R24513607 或者在to_date中写 ITPUB个人空间N2j/U+~'R select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual; (D5Mzl;`3f24513607 注意我这只是举了NLS_DATE_LANGUAGE,当然还有很多, 0Mv!u)yV g'uKo24513607 可查看 4~L h4m^s$D24513607 select * from nls_session_parameters ITPUB个人空间T5L(P)_V%Gh @ select * from V$NLS_PARAMETERS Q Q,w7tMd1t3s"W+A24513607ITPUB个人空间5LX7[{h 8. 3X V&J0X6qR+G24513607 select count(*) ITPUB个人空间#S8Wt.db)p p from ( select rownum-1 rnum ITPUB个人空间d Y$X&sd3T3y|6{L%v from all_objects 5E!L4pi!xS24513607 where rownum <= to_date('2002-02-28','yyyy-mm-dd') - to_date('2002- .ObFh Y7A5T!yy?U24513607 02-01','yyyy-mm-dd')+1 ITPUB个人空间F"iz Z,b lHED ) ITPUB个人空间;BL3{,d A#Cs} m1^ where to_char( to_date('2002-02-01','yyyy-mm-dd')+rnum-1, 'D' ) Edg9_'R&|24513607 not in ( '1', '7' ) ITPUB个人空间`r1X kP{.yk h:b?u/~6iAh24513607 查找2002-02-28至2002-02-01间除星期一和七的天数 :]~WB/g ^24513607 在前后分别调用DBMS_UTILITY.GET_TIME, 让后将结果相减(得到的是1/100秒, 而不是毫秒). (W"PHv3}h+v aX24513607ITPUB个人空间"}/] z gGw 9. 查找月份 /Q5EK]} TH }4MM24513607 select months_between(to_date('01-31-1999','MM-DD-YYYY'),to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL; +FL7b ?tt24513607 1 ITPUB个人空间5q+DIcNZ select months_between(to_date('02-01-1999','MM-DD-YYYY'),to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL; ITPUB个人空间{A;lZ)o p~^:L] j 1.03225806451613ITPUB个人空间QD@ YPN+J ITPUB个人空间y7S0gw+]7HU6D*Q 10. Next_day的用法 IuT9b k24513607 Next_day(date, day) u@fw5Epr'no ~Z24513607 +Igb9DQyEPTfL$@24513607 Monday-Sunday, for format code DAY 4tn+~d7R5A6t$K24513607 Mon-Sun, for format code DY ITPUB个人空间g3jVT5H*o 1-7, for format code D ITPUB个人空间 ukD+|OoF1J m*L;m5x,w\^fKb2451360711 'd;_,LB(W3TJ].i24513607 select to_char(sysdate,'hh:mi:ss') TIME from all_objects ITPUB个人空间;j _)Jn3a ` L kL 注意:第一条记录的TIME 与最后一行是一样的 ITPUB个人空间,Z(TGk j5M6| 可以建立一个函数来处理这个问题 i*v1v%\3Hvf|%m24513607 create or replace function sys_date return date is +y l"Q;uX:H24513607 begin ITPUB个人空间n-y*v+Sm^ E return sysdate; #Z#kTjw9L4C$TJJ24513607 end; R1K u1R Y n)I{n24513607 ITPUB个人空间]om/M,l{ii!l select to_char(sys_date,'hh:mi:ss') from all_objects; ITPUB个人空间:u4O8|$h ~]+B ^ !Ot@`4m*?2451360712.获得小时数 1Y6OW5SXN0^9d24513607 extract()找出日期或间隔值的字段值ITPUB个人空间Is4Ds9q%j SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 2:38:40') from offer ITPUB个人空间 D+z(L[kAu\7FT SQL> select sysdate ,to_char(sysdate,'hh') from dual; ITPUB个人空间1S%S1g1a?6A1B!z7r7p(i g ITPUB个人空间}Ls)Fb(e@L SYSDATE TO_CHAR(SYSDATE,'HH') T9N,p].~ij5}[24513607 -------------------- --------------------- ITPUB个人空间b&u+i;?z |8EK%e 2003-10-13 19:35:21 07 ITPUB个人空间B9]$n|+[Y~ UP -ZL6p-cjs(yQI24513607 SQL> select sysdate ,to_char(sysdate,'hh24') from dual; ITPUB个人空间YX@g){ Wa 7U7Q!^{#F.|;C24513607 SYSDATE TO_CHAR(SYSDATE,'HH24') G \5|6F4K)wIca24513607 -------------------- ----------------------- ITPUB个人空间K-cn^%Q@.q3S` 2003-10-13 19:35:21 19 ITPUB个人空间"vkbr+\$Kj1[V ITPUB个人空间uH#]Cs$?Q fq"] ITPUB个人空间8W m4b(] nb Q N 13.年月日的处理 ITPUB个人空间Ze1~9l;Zq select older_date, ITPUB个人空间Ap"{w(l7r newer_date, ITPUB个人空间!~qiYJ"YHdyR years, ITPUB个人空间8[ l8a8O%u,n months, ITPUB个人空间dD|5g:@-ApC abs( ITPUB个人空间fRCFod'c trunc( ITPUB个人空间 f}2^.MeP^G newer_date- ITPUB个人空间!^%Z\C4n0co)f add_months( older_date,years*12+months ) f8\&Ezn24513607 ) 4N,mPS'|t"kK6Cs24513607 ) daysITPUB个人空间k#@ V){ P.k ITPUB个人空间 ]'Ov'p)y \l from ( select ITPUB个人空间(h M[1]o trunc(months_between( newer_date, older_date )/12) YEARS, ITPUB个人空间 G)Y!J{C.X mod(trunc(months_between( newer_date, older_date )),12 ) MONTHS, ITPUB个人空间7n*Lr M2F _S)o newer_date, ITPUB个人空间C1_6rt }I older_date 1J jj/|Ps&r24513607 from ( pY$_AA1|l l#\'H,m24513607 select hiredate older_date, add_months(hiredate,rownum)+rownum newer_date ITPUB个人空间+R}Ckn2?+G5H from emp 8o:d jT+Yn.H k~@7m24513607 ) ITPUB个人空间1j|F.f'a ) "Q,L.LH3a\w8H24513607ITPUB个人空间yIP(B,T2cg 14.处理月份天数不定的办法 ITPUB个人空间&V"?z/m.W5@t4NP select to_char(add_months(last_day(sysdate) +1, -2), 'yyyymmdd'),last_day(sysdate) from dual *Y1g.r-I:U24513607ITPUB个人空间"nbv6z(g9w l ve2O 16.找出今年的天数 OX(Jl;F3w24513607 select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual &hB]G,N;aA)d"Ol24513607 %l s?|_M2Y24513607 闰年的处理方法 ITPUB个人空间7}2ZPr+|wy&P to_char( last_day( to_date('02' | | :year,'mmyyyy') ), 'dd' ) ITPUB个人空间I^6q!N9V*{ 如果是28就不是闰年 ITPUB个人空间e4nia$n#u.^0q'CGq0e PP;O&waz@2451360717.yyyy与rrrr的区别 %CybN+DA24513607 'YYYY99 TO_C ITPUB个人空间 KPh u,Tm6f,PW ------- ---- MQP7BJ24513607 yyyy 99 0099 or Q1W6@H24513607 rrrr 99 1999 aJ` |m2H9} t24513607 yyyy 01 0001 0?R1\;Lq3Hr|1h24513607 rrrr 01 2001 ITPUB个人空间3a[2\Hr,Ap (s)lS3D)cN?,g2451360718.不同时区的处理 ITPUB个人空间gH(g,|m select to_char( NEW_TIME( sysdate, 'GMT','EST'), 'dd/mm/yyyy hh:mi:ss') ,sysdate ITPUB个人空间9QL9{ u4`Rqr@ ^v[&W from dual; R,u$E1dK24513607ITPUB个人空间(gks%^H^H-_f:g 19.5秒钟一个间隔 J6^H f D6zl!l24513607 Select TO_DATE(FLOOR(TO_CHAR(sysdate,'SSSSS')/300) * 300,'SSSSS') ,TO_CHAR(sysdate,'SSSSS') "D4d%Y g1X.m24513607 from dual ITPUB个人空间5d ?9_-MuE TE9c}:g_4P(yU,T:E-H24513607 2002-11-1 9:55:00 35786 ITPUB个人空间9Z*[D\!P-M0o/F,V#@ SSSSS表示5位秒数 ITPUB个人空间 h6{f2Dl| d CxU'I1| Q2451360720.一年的第几天 7Q$J6I{jr k24513607 select TO_CHAR(SYSDATE,'DDD'),sysdate from dualITPUB个人空间.uqO/A#Z ITPUB个人空间T_"X4\Ze+Ds a^ 310 2002-11-6 10:03:51 wm:[E4A24513607 J5FZ ] bK[y6B2451360721.计算小时,分,秒,毫秒 ITPUB个人空间1sV/CEygz*o)h select +tj;q g{wr*\H:[24513607 Days, ITPUB个人空间,E2f?x"](Z4_*Y A, ITPUB个人空间1s8l/S~@u TRUNC(A*24) Hours, ke6RI/B U24513607 TRUNC(A*24*60 - 60*TRUNC(A*24)) Minutes, j?&h?)A`/gA"B24513607 TRUNC(A*24*60*60 - 60*TRUNC(A*24*60)) Seconds, ITPUB个人空间n3qu"LN _6X j}n TRUNC(A*24*60*60*100 - 100*TRUNC(A*24*60*60)) mSeconds ITPUB个人空间^8XRk@,v-^P from ITPUB个人空间6s~8Tbdx%|ks ( 7q2Pki KsId24513607 select ITPUB个人空间O7K{8Y B!r [ trunc(sysdate) Days, ITPUB个人空间(@x!f;ebV9qt:W sysdate - trunc(sysdate) A %V9`+g {#O f c}Vz24513607 from dual ITPUB个人空间%nb4z Y&i.rTFt/? ) ITPUB个人空间|H)a yt{"`-j!uX}.J :K'SvZ p4h24513607ITPUB个人空间n bsZxu select * from tabname &T I4zg oo%e24513607 order by decode(mode,'FIFO',1,-1)*to_char(rq,'yyyymmddhh24miss'); ITPUB个人空间d @ }H$K$wD ITPUB个人空间*VRMM ]2T // ]0Z@5k H4v*?%v24513607 floor((date2-date1) /365) 作为年 O l'S)F(m \)CAb24513607 floor((date2-date1, 365) /30) 作为月 ITPUB个人空间bjW1euk+iEAr d(mod(date2-date1, 365), 30)作为日. HGXH0O^ u24513607ITPUB个人空间y#A-fVb~3g(Y 23.next_day函数 返回下个星期的日期,day为1-7或星期日-星期六,1表示星期日ITPUB个人空间(}iA%c'F,B5D!X next_day(sysdate,6)是从当前开始下一个星期五。后面的数字是从星期日开始算起。 t GE!D3j _ {3jfq24513607 1 2 3 4 5 6 7 ITPUB个人空间6l;f/i3M.gsXL2[ 日 一 二 三 四 五 六 #Ku Jic2m24513607 &@M'|%~3S24513607 --------------------------------------------------------------- 8Gx ZsR,Q3oy24513607 ITPUB个人空间%`I#d(^W&} select (sysdate-to_date('2003-12-03 12:55:45','yyyy-mm-dd hh24:mi:ss'))*24*60*60 from ddual mzd4m"fs24513607 日期 返回的是天 然后 转换为ssITPUB个人空间 G*s`9_\P ITPUB个人空间~dz6j7PC(K%Hp9U$d 24,round[舍入到最接近的日期](day:舍入到最接近的星期日) ;hzE,hG[rXSm2N(H24513607 select sysdate S1, &~n6vdb`/Z5O24513607 round(sysdate) S2 , (R!?m,n3S.z8iq;I)y24513607 round(sysdate,'year') YEAR,ITPUB个人空间c^/~9l*` round(sysdate,'month') MONTH ,ITPUB个人空间hh;K#hEsN| round(sysdate,'day') DAY from dual Y|#d X?x/h24513607 oV3[8w Q@R2451360725,trunc[截断到最接近的日期,单位为天] ,返回的是日期类型 (}.uufPcH,lS4Zu24513607 select sysdate S1, XV/Z;r A5Q:T6t9[24513607 trunc(sysdate) S2, //返回当前日期,无时分秒ITPUB个人空间0\kx:].Dr.c trunc(sysdate,'year') YEAR, //返回当前年的1月1日,无时分秒ITPUB个人空间-P+QOfLW,l}p trunc(sysdate,'month') MONTH , //返回当前月的1日,无时分秒 ,X1T!@IlJ$x24513607 trunc(sysdate,'day') DAY //返回当前星期的星期天,无时分秒ITPUB个人空间%l9|*co"H,fZ$C4_9[$f from dual *F |d o)Fwe-x24513607ITPUB个人空间5As:@~ ~kLIC 26,返回日期列表中最晚日期 @+Fk:Q\2JJv24513607 select greatest('01-1月-04','04-1月-04','10-2月-04') from dual "F(R8l u+~-S+x24513607 'C7D;EZ"N!V||)e2451360727.计算时间差 .f5{#d \$y24513607 注:oracle时间差是以天数为单位,所以换算成年月,日 rf f"Ib m'P w$h?!WE24513607 ITPUB个人空间e"Rm/B/UU _ select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))/365) as spanYears from dual //时间差-年 7Aj5IrY2DPE24513607 select ceil(moths_between(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))) as spanMonths from dual //时间差-月 a ew.fZuV@24513607 select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))) as spanDays from dual //时间差-天ITPUB个人空间)Ww)G+R|(` select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))*24) as spanHours from dual //时间差-时ITPUB个人空间ty^j2TKS select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))*24*60) as spanMinutes from dual //时间差-分ITPUB个人空间#u+I UYT]!m,L select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))*24*60*60) as spanSeconds from dual //时间差-秒ITPUB个人空间Y~4z|+^(J1JI #c/YD3H4UgM2451360728.更新时间ITPUB个人空间'e#F-G'I@ 注:oracle时间加减是以天数为单位,设改变量为n,所以换算成年月,日ITPUB个人空间e$`V o:M.K select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n*365,'yyyy-mm-dd hh24:mi:ss') as newTime from dual //改变时间-年 (k5C-bd R3|$i,S3f24513607 select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),add_months(sysdate,n) as newTime from dual //改变时间-月ITPUB个人空间#NlkY;{ select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n,'yyyy-mm-dd hh24:mi:ss') as newTime from dual //改变时间-日ITPUB个人空间 nf\'BXsC select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n/24,'yyyy-mm-dd hh24:mi:ss') as newTime from dual //改变时间-时 Ke N^;_p5k/cRR24513607 select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n/24/60,'yyyy-mm-dd hh24:mi:ss') as newTime from dual //改变时间-分 L)?;yV5n qUUE2m!R24513607 select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n/24/60/60,'yyyy-mm-dd hh24:mi:ss') as newTime from dual //改变时间-秒ITPUB个人空间,h"LK8Q'mtTz(Sy2R5k ITPUB个人空间MjaX zxj 29.查找月的第一天,最后一天ITPUB个人空间6J.s'@X*QlF SELECT Trunc(Trunc(SYSDATE, 'MONTH') - 1, 'MONTH') First_Day_Last_Month, (J+Ww#ZQ7q"oC24513607 Trunc(SYSDATE, 'MONTH') - 1 / 86400 Last_Day_Last_Month, 5L0A.W Mf A6hL ys3p24513607 Trunc(SYSDATE, 'MONTH') First_Day_Cur_Month,ITPUB个人空间2D*Ou%pW;b:Ta5_ LAST_DAY(Trunc(SYSDATE, 'MONTH')) + 1 - 1 / 86400 Last_Day_Cur_Month ![.mhg z:B%gm~[ m24513607 FROM dual; a a(L!Uj6y24513607 .R#] u4l\&]3w,s!v.po|24513607ITPUB个人空间 sz`,Fl 三. 字符函数(可用于字面字符或数据库列) %XLK\BwJ24513607 r Z!D'Uh9xTI*Q245136071,字符串截取 (b-\,M q+_x9F~2V24513607 select substr('abcdef',1,3) from dualITPUB个人空间bx m I4L ITPUB个人空间,v q-\4^o Q|&` 2,查找子串位置 q+z/gP/Vf"_e24513607 select instr('abcfdgfdhd','fd') from dualITPUB个人空间_[ gc+@z1vV D$W(w`L245136073,字符串连接ITPUB个人空间*g*u]$l;c]9DX select 'HELLO'||'hello world' from dual;ITPUB个人空间R"y$jS R#O6sRI ITPUB个人空间3kb DF K 4, 1)去掉字符串中的空格 z |fL}24513607 select ltrim(' abc') s1, R:}9gRO2y\24513607 rtrim('zhang ') s2,ITPUB个人空间!wPRC#K"?3l$y:M trim(' zhang ') s3 from dualITPUB个人空间k%A0X4E1}4pZ7a 2)去掉前导和后缀ITPUB个人空间Y3xx RC| fO select trim(leading 9 from 9998767999) s1,ITPUB个人空间jI|/_RU8P5@ trim(trailing 9 from 9998767999) s2, 7E-R P"I:x/`"Y3K24513607 trim(9 from 9998767999) s3 from dual; w^d'{kM9P*s#l24513607 8}xW'Eq,z1jG ]+r245136075, 返回字符串首字母的Ascii值 r}e1T)u3A ]b s24513607 select ascii('a') from dualITPUB个人空间p \"J/oFEv ITPUB个人空间(yKQ uar 6,返回ascii值对应的字母 -El @a?Wi:p {;C_24513607 select chr(97) from dual cVXw$bO'ZE@j}24513607 /O9u{9d,F)v(o!@ a j245136077,计算字符串长度 t.n5wj,H lN24513607 select length('abcdef') from dual D[`+nc#^hF9Noo24513607 :I QU M&k/qg]%Q*i1V/K245136078,initcap(首字母变大写) ,lower(变小写),upper(变大写)ITPUB个人空间 f*f;};L$NBaz$C'd select lower('ABC') s1, 5zL6[w5J)d#?6aE}24513607 upper('def') s2, 4vTJ?_'I$A24513607 initcap('efg') s3ITPUB个人空间5d*|Y#g|)M Yn~1\ from dual;ITPUB个人空间Jrrp%?'pp ITPUB个人空间^{p DO[4@ 9,ReplaceITPUB个人空间/r!LoVlNu!c#| select replace('abc','b','xy') from dual; 7KA-`,Th$?m24513607 /\*Ie3SL-A;^/\I fW2451360710,translate $],h9J4x:r |%f0O L24513607 select translate('abc','b','xx') from dual; -- x是1位ITPUB个人空间$Gt;mc.k!Qu/X ITPUB个人空间LB b QF@ 11,lpad [左添充] rpad [右填充](用于控制输出格式)ITPUB个人空间L$qU \tI)z!t'Cq select lpad('func',15,'=') s1, rpad('func',15,'-') s2 from dual;ITPUB个人空间9b6} {o'\uS"?g1|/m select lpad(dname,14,'=') from dept;ITPUB个人空间9O7fpcdD 2jz(@#J{N2451360712, decode[实现if ..then 逻辑] 注:第一个是表达式,最后一个是不满足任何一个条件的值 -{mE_!U#X`i24513607 select deptno,decode(deptno,10,'1',20,'2',30,'3','其他') from dept;ITPUB个人空间,UTx6T8t6@wSk%cT 例: P2y5MCK j24513607 select seed,account_name,decode(seed,111,1000,200,2000,0) from t_userInfo//如果seed为111,则取1000;为200,取2000;其它取0ITPUB个人空间c n4QF ].}+PW'd{2a select seed,account_name,decode(sign(seed-111),1,'big seed',-1,'little seed','equal seed') from t_userInfo//如果seed>111,则显示大;为200,则显示小;其它则显 f'^L&C(RD24513607ITPUB个人空间'Rp1VR5AH 示相等ITPUB个人空间Q V,e"A:H7`-Ah5w$U ?,JY-TN2K4s\2Uo\2451360713 case[实现switch ..case 逻辑] Zjq"|H:W24513607 SELECT CASE X-FIELDITPUB个人空间 v'u%u ~K1~x WHEN X-FIELD < 40 THEN 'X-FIELD 小于 40'ITPUB个人空间yx rP|&]%OH"D)e WHEN X-FIELD < 50 THEN 'X-FIELD 小于 50' 6Mis ma2~qx24513607 WHEN X-FIELD < 60 THEN 'X-FIELD 小于 60'ITPUB个人空间^$g4ONfZt d&a:`&AJ ELSE 'UNBEKNOWN' K ~.Nx%Sh24513607 END ^@i,U%v5@k(V24513607 FROM DUALITPUB个人空间5j;?N#aTF ITPUB个人空间'T/EW!{&t(swH'zX 注:CASE语句在处理类似问题就显得非常灵活。当只是需要匹配少量数值时,用Decode更为简洁。ITPUB个人空间r$h:X"V.nswp A J Y3T2oXm)`24513607四.数字函数 1Qd8Fz4?!@ gU4I245136071,取整函数(ceil 向上取整,floor 向下取整) Af jFr+B.r$[#bi24513607 select ceil(66.6) N1,floor(66.6) N2 from dual; c ^ RZcZ%b+wP&^24513607 k;n0Rm(wQ:Y245136072, 取幂(power) 和 求平方根(sqrt)ITPUB个人空间;Cs s x}wr K:T+q^J select power(3,2) N1,sqrt(9) N2 from dual; Dx/mP4R24513607 )Q\1J8r r c g2qk U245136073,求余ITPUB个人空间5EIg+Oq0X-s select mod(9,5) from dual;ITPUB个人空间uRt1b ?3o;xe1A*H ITPUB个人空间 t2p6W0M{ 4,返回固定小数位数 (round:四舍五入,trunc:直接截断) 0pb y't9]'q24513607 select round(66.667,2) N1,trunc(66.667,2) N2 from dual;ITPUB个人空间~S)~V^E-Y'v9O ITPUB个人空间N%C;}{\uX^Oi 5,返回值的符号(正数返回为1,负数为-1) J$t#l4jh,m$U24513607 select sign(-32),sign(293) from dual;ITPUB个人空间.nE'sB2_2O*ur e1xuNw*T}'w24513607五.转换函数ITPUB个人空间!t:TD"olsj]x 1,to_char()[将日期和数字类型转换成字符类型] Uv2@#Ye+T24513607 1) select to_char(sysdate) s1, 0S e| S@h9S_24513607 to_char(sysdate,'yyyy-mm-dd') s2, yo+TZmOi'B?24513607 to_char(sysdate,'yyyy') s3, i?o~$u@QI24513607 to_char(sysdate,'yyyy-mm-dd hh12:mi:ss') s4,ITPUB个人空间1LX*dqz3h'y dA to_char(sysdate, 'hh24:mi:ss') s5,ITPUB个人空间{W*e\` LEr to_char(sysdate,'DAY') s6 a+d@#S,T2N`24513607 from dual;ITPUB个人空间ZIk6ia 2) select sal,to_char(sal,'$99999') n1,to_char(sal,'$99,999') n2 from empITPUB个人空间+@0KKo#\z @6p(Y!bi FE_3\ m245136072, to_date()[将字符类型转换为日期类型] p]l/NorK&[24513607 insert into emp(empno,hiredate) values(8000,to_date('2004-10-10','yyyy-mm-dd'));ITPUB个人空间E.A{d8z+g ITPUB个人空间4\Gy-Q XL?E t 3, to_number() 转换为数字类型ITPUB个人空间C\7vz ue]5^ select to_number(to_char(sysdate,'hh12')) from dual; //以数字显示的小时数 f5O AXm24513607 ITPUB个人空间*NN3XTM3I2oK%J 六.其他函数ITPUB个人空间k#M r+B!D:C$v{ 1.user: `-eV ?4L$_x24513607 返回登录的用户名称 %vU,k7l|,H,y6j24513607 select user from dual;ITPUB个人空间0NI'Bt*}[ g\Gw3}o,gW m24513607 2.vsize: +Y6?5l}8o }*Fj;S24513607 返回表达式所需的字节数 p },q%g5csZR24513607 select vsize('HELLO') from dual; p2_@X-x*z0o%w24513607 ITPUB个人空间K;?8MOO@-q@G 3.nvl(ex1,ex2): gs|LtW24513607 ex1值为空则返回ex2,否则返回该值本身ex1(常用)ITPUB个人空间 }b-_t'g,O`3{Si 例:如果雇员没有佣金,将显示0,否则显示佣金 E&X/wF O8s24513607 select comm,nvl(comm,0) from emp;ITPUB个人空间_rP|;v)h%Ve F)J#LD-jk$`E9X24513607 4.nullif(ex1,ex2):ITPUB个人空间;er5vT;YS%SwK 值相等返空,否则返回第一个值 r9C(^7` u@24513607 例:如果工资和佣金相等,则显示空,否则显示工资ITPUB个人空间}H7|'h2B)w]m select nullif(sal,comm),sal,comm from emp; b/T"\ b/s_&g]yG24513607 ITPUB个人空间:j'y:eR!jC-hq 5.coalesce: :M4pm2w^ S g&ihR24513607 返回列表中第一个非空表达式 j(~ R)y"Z&G$Stq24513607 select comm,sal,coalesce(comm,sal,sal*10) from emp;ITPUB个人空间u s GT HX)E4zi ~ TWvJ'Q24513607 6.nvl2(ex1,ex2,ex3) : j;o1[ zh)i:z+rk24513607 如果ex1不为空,显示ex2,否则显示ex3ITPUB个人空间&td$f(Yvex(Q 如:查看有佣金的雇员姓名以及他们的佣金 ,r Jc[W24513607 select nvl2(comm,ename,') as HaveCommName,comm from emp;ITPUB个人空间6I|#t2wE$\%S ITPUB个人空间dwkY.o ITPUB个人空间nDOK,s.kbPW%`XV 七.分组函数ITPUB个人空间_Ij*@(T max min avg count sumITPUB个人空间Vx,Fz;Y/mP UW;p 1,整个结果集是一个组ITPUB个人空间6yFu;B ka? 1) 求部门30 的最高工资,最低工资,平均工资,总人数,有工作的人数,工种数量及工资总和ITPUB个人空间 m8c/rsN!~ @H0B F O select max(ename),max(sal),ITPUB个人空间)? t+M[L9z,T min(ename),min(sal),ITPUB个人空间:`i;^F1^+x%k%k_ avg(sal),ITPUB个人空间 Im?eMiE count(*) ,count(job),count(distinct(job)) , 8S6OK^;K!f24513607 sum(sal) from emp where deptno=30; 4n7L+j Z-T]R/Z u R245136072, 带group by 和 having 的分组ITPUB个人空间FI.VcRD mX 1)按部门分组求最高工资,最低工资,总人数,有工作的人数,工种数量及工资总和ITPUB个人空间_i4?6j4De X jW select deptno, max(ename),max(sal), 6Y"oW"})A6i?*tK rQ24513607 min(ename),min(sal),ITPUB个人空间2G:\K8ze.C avg(sal),ITPUB个人空间x3]-\;[xt&_7W V N'c count(*) ,count(job),count(distinct(job)) , d^ hM-|.R(lz24513607 sum(sal) from emp group by deptno; )W|{Z4XW8h24513607 R&O5y1|O2Hp P24513607 2)部门30的最高工资,最低工资,总人数,有工作的人数,工种数量及工资总和ITPUB个人空间8QPf/ke select deptno, max(ename),max(sal),ITPUB个人空间 Td.pE'h/N,WZv min(ename),min(sal), [7Y5Msp[24513607 avg(sal),ITPUB个人空间m$T[Gc k count(*) ,count(job),count(distinct(job)) ,ITPUB个人空间/A:N5P2UG1|tf5c sum(sal) from emp group by deptno having deptno=30;ITPUB个人空间Z@2o3g*R\3v l5w ITPUB个人空间E:j6x"x.v:j9m 3, stddev 返回一组值的标准偏差ITPUB个人空间W\C.x m+ov select deptno,stddev(sal) from emp group by deptno; \wb5f5m!@)}*y"b+i24513607 variance 返回一组值的方差差ITPUB个人空间7E#RgW} select deptno,variance(sal) from emp group by deptno;ITPUB个人空间.?!y/kl-K8L%w Tq po*{;X'@$u T245136074, 带有rollup和cube操作符的Group ByITPUB个人空间%fO%k'\V [omU-e rollup 按分组的第一个列进行统计和最后的小计ITPUB个人空间2BU[RL cube 按分组的所有列的进行统计和最后的小计ITPUB个人空间,BC D`*Cq8n select deptno,job ,sum(sal) from emp group by deptno,job;ITPUB个人空间@7dL;V { g select deptno,job ,sum(sal) from emp group by rollup(deptno,job);ITPUB个人空间+W k+T6XG(V a;^2N cube 产生组内所有列的统计和最后的小计ITPUB个人空间%o3h1d1R@:T }0P select deptno,job ,sum(sal) from emp group by cube(deptno,job); *\3e&?#`;zcD24513607ITPUB个人空间1uV RT#d/v)M 八、临时表ITPUB个人空间 ^[x Or 只在会话期间或在事务处理期间存在的表.ITPUB个人空间(uOUb8cR&XL 临时表在插入数据时,动态分配空间 aG2d%~0\9Uj24513607 create global temporary table temp_dept '~2N1L#y7l_g24513607 (dno number,ITPUB个人空间9O&Y#]1V0|m'a dname varchar2(10)) wiw/O5Y^ Wi24513607 on commit delete rows; U.O;z3a-pV#H\e24513607 insert into temp_dept values(10,'ABC'); R2K TX Lu+Sw"]6p24513607 commit; o i4zc R&H[o~ _0~24513607 select * from temp_dept; --无数据显示,数据自动清除ITPUB个人空间f9jp2VOuG g on commit preserve rows:在会话期间表一直可以存在(保留数据)ITPUB个人空间3^H5Zk-~)\&j)@ on commit delete rows:事务结束清除数据(在事务结束时自动删除表的数据) w&Z(mq9Y24513607 |
|