十五年测试老手,长期负责WEB\APP 项目测试,目前主要负责团队管理工作。

【转】Oracle时间运算

上一篇 / 下一篇  2011-07-09 15:04:27 / 个人分类:Oracle

目录
4? {F4r:keu[0=========================================51Testing软件测试网0El:?OO:{.j
1.Oracle的日期函数
8Z J}P9u02.日期加减51Testing软件测试网,Da-al7|\6P
3.月份加减
y'K []*?04.年份加减
yXG(o]2r05.求每月的最后一天51Testing软件测试网 ds/y5Jr2O4I
6.求每月的第一天51Testing软件测试网$S d%e%W`W
7.求下一个星期几
0y,[Nev.A&Zl e3c6B051Testing软件测试网*@ NpR]a {ZG
入门知识:
~.Fj@(JZ,s7\|9Bn8p0
zMN2K6MB0
Oracle中的日期时间存储:
/T/W8tHx i_0
oracle数据库中存放时间格式的数据,是以oracle特定的格式存贮的,占7个字节,与查询时显示的时间格式无关。不存贮秒以下的时间单位。
q*M9A1B dlZ,?&dm0
②Oracle中的日期时间显示:51Testing软件测试网 j#?TD0Ql/~4`
通常,客户端与数据库建立起连接后,oracle就会给一个缺省的时间格式数据的显示形式,与所使用的字符集有关。一般显示年月日,而不显示时分秒。51Testing软件测试网8]8H.y^)j5SY
③Oracle中的日期时间插入:
5Z*J0SC'i2R"^^ c0
向表中插入数据时,如果不使用转换函数,则时间字段的格式必须遵从会话环境的时间格式,否则不能插入。
-O#U M?)r7X,`o/l/p0
④Oracle中的日期时间格式修改:
!R(u&s6n)G9R F0
a.SQL> alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
S ckn;xb0
b.册表\hkey_local_machine\software\oracle\home0主键中增加一个字串(8i版本),字串名为nls_date_format,字串的值为你希望定义的时间格式51Testing软件测试网 l!^4Z2z hZ)a3?
前者只对当前会话有效,也即是一旦你关闭了SQL*PLUS窗口或重新打开一个SQL*PLUS窗口,日期时间格式依然采用本地字符集对应的日期时间格式。后者对所有客户端应用有效。当两者同时应用时,以alter session的修改为准。51Testing软件测试网bE'B.M.U ~1A

mw%o j h"Rp0
1M`-u`Ki6[0
一、Oracle的日期函数:
[N$a&bJ@r6E {;Xs0
51Testing软件测试网;Vh#j f,C(o-@z
Oracle从8i开始就提供了大量的日期函数,这些日期函数包括对日期进行加减、转换、截取等功能。下面是Oracle提供的日期函数一览表 

Function51Testing软件测试网-Y,siu8A fic

Use

b5E0O{RYn3_0

ADD_MONTHS

|2} gS;@A0

Adds months to a date

_3K"S Rb\l0

LAST_DAY51Testing软件测试网R2x9I.QE1e&D

Computes the last day of the month51Testing软件测试网e-c$N kP-^;V4n$X

MONTHS_BETWEEN

pFt4D)?:G&XO:A0

Determines the number of months between two dates51Testing软件测试网Hj CT4e

NEW_TIME

|Vl)J/v]~ BP0

Translates a time to a new time zone51Testing软件测试网6ij#M3f7DZWbC

NEXT_DAY

&j{#fNH2Q%O0

Returns the date of the next specified weekday51Testing软件测试网il\ N3p2m+zxtf

ROUND51Testing软件测试网@+Kr9Q\Bg4g

Rounds a date/time value to a specified element51Testing软件测试网%Cabp,LAO2VI

SYSDATE

v+tid%j E7c:po0

Returns the current date and time51Testing软件测试网S*Lo} Yv5_5RO\t

TO_CHAR

/]9{&p3`O&[!}0

Converts dates to strings51Testing软件测试网v_T5n H/v^FAs

TO_DATE

{x+Pf5O6b"o)G0

Converts strings and numbers to dates

L o&a'OK0c"O(H/L0

TRUNC51Testing软件测试网t2m:Lm;A B/E

Truncates a date/time value to a specific element

2`OFw t/S[0

fN.EcI$S K0二、日期加减:
:`XF9NO0
51Testing软件测试网rZzGP` w
在Oralce中,对日期进行加减操作的默认单位是天,也就是说如果我们向当前日期加1的话是加上一天,而不是一秒或一小时。那么对一天中的一段时间进行加减要怎么做呢?很简单!只需将它们转化为以天为单位即可。51Testing软件测试网i_#[\?,m;U*t

(o JyC#AOH3w7i0【1】为当前时间加上30分钟:
SQL> select to_char(sysdate, 'yyyy-mm-dd hh:mi:ss'now_date,51Testing软件测试网x"IQI+{
  
2             to_char(sysdate+(30/24/60), 'yyyy-mm-dd hh:mi:ss'new_date
_Rk SG1D qU0  
3    from dual;
]D1kaYz{051Testing软件测试网Nlg"lv9N"MHp
NOW_DATE                               NEW_DATE51Testing软件测试网cO1mW5r4i`U"?8?
-------------------------------------- --------------------------------------51Testing软件测试网f@/ai;N2]
2008-06-30 10:47:31                    2008-06-30 11:17:31
S#`mjU;K:F5A051Testing软件测试网:OEKM$Y"x}i
SQL
> 
51Testing软件测试网{/v` K2xx cj
我们看到了在绿色高亮处使用30/24/60将分钟转换成天。另外一个要注意的地方是:SQL*PLUS环境下默认的日期格式:NLS_DATE_FORMAT是DD-MM-YYYY,也即是不包含时、分、秒,所以我们这里必须采用to_char的方式指定输入的日期格式。51Testing软件测试网8C$?swj$EX
51Testing软件测试网G-]4`~E ]
除此之外也可以通过在SQL*PLUS中执行下列语句修改默认的日期输出格式,这样的话就不需要通过to_char来转换了,直接输出就行。
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

.x;j%USZ_zR,m!h0【2】为当前时间减去30分钟:
SQL> select to_char(sysdate+(-30/24/60),'yyyy-mm-dd hh:mi:ss'new_date from dual;
&@8b)@0p,F7v8S;~0
"l ?;],cXOa cY0NEW_DATE
Of3E+Mk#NO)z]{0
--------------------------------------51Testing软件测试网R$M(O%S K Z'|
2008-06-30 10:24:59

G!~OQ^2a&x%wy(_9e0只需要加上一个负数即可以了。51Testing软件测试网Z&T? Y4@ d
51Testing软件测试网@u j(Yf
三、月份加减:
l/V$k+i4JC_5uk0
T){}:G*?;A4t[;A0月份的加减和日期加减相比要难了很多,因为每个月份的天数并不是固定的,可能是31,30,29,28。如果采用上面的方法将月份转换成实际天数将不可避免地出现多个判断,幸亏Oracle为我们提供了一个add_months函数,这个函数会自动判断月份的天数。看看下面的例子:51Testing软件测试网R-wZ W0E"q
51Testing软件测试网T.jg\1s]
【1】为当前时间加上6个月:
SQL> select add_months(sysdate, 6from dual;
5er"JCpW1T051Testing软件测试网;\ M/E"XG+^Q
ADD_MONTHS51Testing软件测试网:H#rw Is#TVS2A$l
----------

:[;s!]6sk0
31-12月-08
51Testing软件测试网q6lfbV\k
【2】为当前时间减去6个月:
SQL> select add_months(sysdate, -6from dual;
)z*NaMP7l:n051Testing软件测试网#g)P3J\"S8Of
ADD_MONTHS51Testing软件测试网 x}!L MO"x5P p p9DC
----------
51Testing软件测试网5R7|.W/W.Ni-KP;x0A
31-12月-07
51Testing软件测试网)zLv+RQ*T
【3】求两个日期相差的月数:
@)e_ q!{r g Fu0
;AW{(KBmm$f%Z0通常情况下两个时间相减将得到以天数为单位的结果,可是有时我们更希望得到以月为单位的结果,如果手动转换这太麻烦了,所以Oracle又提供了一个函数,这个函数就是months_between。
SQL> select months_between(sysdate,51Testing软件测试网da2UU]cl"G
  
2         to_date('2008-01-01 01:00:00''yyyy-mm-dd hh:mi:ss')) result
"GT6W*`(IcQ5x0  
3    from dual;51Testing软件测试网)\HyH8dI

]Z?cP^ x{0    RESULT51Testing软件测试网(v+vz!ZE,}*m7a!i%d
----------51Testing软件测试网jg'?F0z*d
5.94928203
51Testing软件测试网e6C\%C~$T'_o
months_between函数有2个参数,第一个参数是结束日期,第二个参数是开始日期,Oracle用第一个参数减去第二个参数得到月份数。所以结果有可能会是负数的。51Testing软件测试网W%|3|t&^(M

yQ5ly%d0四、年份加减:
"b3a{;MQ*C f$P051Testing软件测试网gR(T~,o/NS
Oracle并不直接提供对年份进行加减的函数,不过有了add_months和months_between函数,我们照样可以做到。51Testing软件测试网 b7_2g#cl0l8V

g gu(JB7v m!Q0【1】为当前日期加上2年:
SQL> select add_months(sysdate, 2*12) two_years_later51Testing软件测试网I Hm @w
  
2      from dual;
6f A~*^9`y7Tq&q_0
u xix&j.pA l&g\}0TWO_YEARS_
o;L u:Ktv([b0
----------
相关阅读:

TAG: Oracle oracle

 

评分:0

我来说两句

Open Toolbar