oracle日期时间类型

oracle日期时间类型
oracle日期时间类型

Oracle 数据类型及存储方式(三)日期时间类型——袁光东[转]

2009年10月18日星期日 16:57

第三部分日期时间类型

§3.1 DATE

Date类型Oralce用于表示日期和时间的数据类型。固定占用7个字节。

包括七个属性:

世纪

世纪中的年份

月份

月份中的哪一天

小时

SQL> create table test_date(col_date date);

Table created

SQL> insert into test_date values(to_date('2008-06-27

10:35:00','yyyy-mm-dd hh24:mi:ss'));

1 row inserted

SQL> select to_char(col_date,'yyyy-mm-dd hh24:mi:ss'),dump(col_date) from test_date;

TO_CHAR(COL_DATE,'YYYY-MM-DDHH DUMP(COL_DATE)

------------------------------

--------------------------------------------------------------------------------

2008-06-27 10:35:00 Typ=12 Len=7: 120,108,6,27,11,36,1

Date类型的内部编码为12

长度:占用7个字节

数据存储的每一位到第七位分别为:世纪,年,月,日,时,分,秒。

世纪:采用”加100”表示法来存储。即世纪+100来存储。120 – 100 = 20 年:跟世纪一样采用”加100”表示法来存储。108 – 100 = 08(采用两位表示) 月:自然存储.6

日:自然存储,不做修改,27

时:(时,分,秒都采用“加1”法存储)11 -1= 10

分:36 -1 = 35

秒:1 -1 = 0

为什么世纪和年份要用加100法存储呢?是为了支持BC和AD日期。

BC即为公元前。

AD即为公元。

如果世纪– 100为一个负数,那么就是一个BC日期。

插入一个公元前日期

SQL> insert into test_date values(to_date('-4712-01-01','syyyy-mm-dd hh24:mi:ss'));

1 row inserted

SQL> select to_char(col_date,'bc yyyy-mm-dd hh24:mi:ss'),dump(col_date) from test_date;

TO_CHAR(COL_DATE,'BCYYYY-MM-DD DUMP(COL_DATE)

------------------------------

--------------------------------------------------------------------------------

公元 2008-06-27 10:35:00 Typ=12 Len=7: 120,108,6,27,11,36,1

公元前 4712-01-01 00:00:00 Typ=12 Len=7: 53,88,1,1,1,1,1

我们已经了解了日期的存储结构。当要对日期进行截取时,比如去掉时,分,秒。只需要把最后的三个字节设为:12 12 1就可以了。

SQL> create table test_date1 (col_char varchar2(12), col_date date);

Table created

SQL> insert into test_date1 values('full',to_date('2008-06-27

12:01:00','yyyy-mm-dd hh24:mi:ss'));

1 row inserted

SQL> insert into test_date1(col_char,col_date) select 'minute',

trunc(col_date,'mi') from test_date1

2 union all

3 select 'day', trunc(col_date,'dd') from test_date1

4 union all

5 select 'month',trunc(col_date,'mm') from test_date1

6 union all

7 select 'year',trunc(col_date,'y') from test_date1

8 ;

4 rows inserted

SQL> select col_char, col_date,dump(col_date) from test_date1;

COL_CHAR COL_DATE DUMP(COL_DATE)

------------ -----------

--------------------------------------------------------------------------------

full 2008-6-27 1 Typ=12 Len=7: 120,108,6,27,13,2,1

minute 2008-6-27 1 Typ=12 Len=7: 120,108,6,27,13,2,1

day 2008-6-27 Typ=12 Len=7: 120,108,6,27,1,1,1

month 2008-6-1 Typ=12 Len=7: 120,108,6,1,1,1,1

year 2008-1-1 Typ=12 Len=7: 120,108,1,1,1,1,1

要把一个日期截取,只取到年。数据库只是把最后5个字节置上1。这是非常快的。

当我们对一个Date字段进行操作,需要截取到年份进行比较时,我们经常使用to_char函数。通过会这样写。

Select * from test_date1 where to_char(col_date ,’yyyy’) = ‘2008’ 而不是

Select * from test_date1 where trunc(col_date,’y’) =

to_date(‘2008-01-01’,’yyyy-mm-dd’)

使用trunc会占用更少的资源,性能更优。

使用to_char所有的CPU时间与trunc相差一个数量级,差不多10倍。因为

to_char必须把日期转换成一个串,并利用当前系统所采用的NLS来完成,然后执行一个串与串的比较。而TRUNC只需要把后5个字节设置为1,然后将两个7位的字节的二进行数进行比较就搞定了。所要截取一个DATE列叶,应该避免使用to_char.

另外,要完全避免对DATE列应用函数。比如我们要查询2008年的所有数据,并且这一列上也有索引,我们希望能够用上这个索引。

SQL> select count(col_date) from test_date1 where col_date >=

to_date('2008-01-01','yyyy-mm-dd') and col_date <

to_date('2009-01-01','yyyy-mm-dd');

COUNT(COL_DATE)

---------------

5

§3.2 向Date类型增加或减时间

怎么向Date类型增加时间,例如:向Date增加1天,或1小时,或1秒,一月等。

常有的办法有几个方法:

a.向date增加一个NUMBER值。因为Date 加减操作是以天为单位。1秒就是

1/24/60/60。依此类推。

b.使用INTERVAL类型。后续会介绍

c.使用内置函数add_months增加月。增加月不像增加天那么简单,所以需要使用内置函数来处理。

3.2.1 增加秒

SQL> create table test_date2(id varchar2(10), operate_time date);

Table created

SQL> insert into test_date2 values('1',sysdate);

1 row inserted

SQL> select id, to_char(operate_time, 'yyyy-mm-dd hh24:mi:ss') from test_date2 where id=1;

ID TO_CHAR(OPERATE_TIME,'YYYY-MM-

---------- ------------------------------

1 2008-06-27 13:35:35

SQL> update test_date2 set operate_time = operate_time + 1/24/60/60 where id=1;

1 row updated

SQL> select id, to_char(operate_time, 'yyyy-mm-dd hh24:mi:ss') from test_date2 where id=1;

ID TO_CHAR(OPERATE_TIME,'YYYY-MM-

---------- ------------------------------

1 2008-06-27 13:35:36

3.2.2 增加分

SQL> update test_date2 set operate_time = operate_time + 1/24/60 where id=1;

1 row updated

SQL> select id, to_char(operate_time, 'yyyy-mm-dd hh24:mi:ss') from test_date2 where id=1;

ID TO_CHAR(OPERATE_TIME,'YYYY-MM-

---------- ------------------------------

1 2008-06-27 13:36:36

3.2.3 增加小时

SQL> update test_date2 set operate_time = operate_time + 1/24 where id=1;

1 row updated

SQL> select id, to_char(operate_time, 'yyyy-mm-dd hh24:mi:ss') from test_date2 where id=1;

ID TO_CHAR(OPERATE_TIME,'YYYY-MM-

---------- ------------------------------

1 2008-06-27 14:36:36

3.2.4 增加天

SQL> update test_date2 set operate_time = operate_time + 1 where id=1;

1 row updated

SQL> select id, to_char(operate_time, 'yyyy-mm-dd hh24:mi:ss') from test_date2 where id=1;

ID TO_CHAR(OPERATE_TIME,'YYYY-MM-

---------- ------------------------------

1 2008-06-28 14:36:36

3.2.4 增加周

SQL> update test_date2 set operate_time = operate_time + 1 * 7 where id=1;

1 row updated

SQL> select id, to_char(operate_time, 'yyyy-mm-dd hh24:mi:ss') from test_date2 where id=1;

ID TO_CHAR(OPERATE_TIME,'YYYY-MM-

---------- ------------------------------

1 2008-07-05 14:36:36

3.2.5 增加月

SQL> update test_date2 set operate_time = add_months(operate_time,1) where id=1;

1 row updated

SQL> select id, to_char(operate_time, 'yyyy-mm-dd hh24:mi:ss') from test_date2 where id=1;

ID TO_CHAR(OPERATE_TIME,'YYYY-MM-

---------- ------------------------------

1 2008-08-05 14:36:36

3.2.6 增加年

SQL> update test_date2 set operate_time = add_months(operate_time,1 * 12) where id=1;

1 row updated

SQL> select id, to_char(operate_time, 'yyyy-mm-dd hh24:mi:ss') from test_date2 where id=1;

ID TO_CHAR(OPERATE_TIME,'YYYY-MM-

---------- ------------------------------

1 2009-08-05 14:36:36

另外可以使用一个非常有用的函数NUMTODSINTERVAL来新增加小时,分钟,秒。SQL> update test_date2 set operate_time = operate_time + numtodsinterval(1,'second') where id=1;

1 row updated

SQL> select id, to_char(operate_time, 'yyyy-mm-dd hh24:mi:ss') from test_date2 where id=1;

ID TO_CHAR(OPERATE_TIME,'YYYY-MM-

---------- ------------------------------

1 2009-08-05 14:36:37

Numtodsinterval(n, 'second') 获得秒的时间间隔

Numtodsinterval(n, 'minute') 获得分的时间间隔

Numtodsinterval(n, 'month') 获得月的时间间隔

Numtodsinterval(n, 'year') 获得月的时间间隔

增加月份时要非常的小心,应该使用add_months函数。为什么呢?

比如当前日期为2000-2-29日。增加一个月得到的日期就应该是2000-3-31

如果只是简单的加30天或加31天,是无法实现的。所以必须使用add_months

函数,它会自动来处理这种月末问题。对年份进行增加也会出现类似的问题

§3.3 TIMESTAMP

TIMESTAMP是支持小数秒和时区的日期/时间类型。对秒的精确度更高。

3.3.1 TIMESTAM语法

TIMESTAMP(n)

N的取值为0~9.表示指定TIMESTAMP中秒的小数位数。N为可选。如果n为0,timestamp与date等价。

SQL> create table test_timestamp(col_date date, col_timestamp timestamp(0));

Table created

SQL> insert into test_timestamp values(sysdate,systimestamp);

1 row inserted

SQL> select dump(col_date) from test_timestamp;

DUMP(COL_DATE)

--------------------------------------------------------------------------------

Typ=12 Len=7: 120,108,6,27,17,8,37

SQL> select dump(col_timestamp) from test_timestamp;

DUMP(COL_TIMESTAMP)

--------------------------------------------------------------------------------

Typ=180 Len=7: 120,108,6,27,17,8,38

如果指定了保留小数位数,那情况就大不一样了。

SQL> create table test_timestamp1 (col_date date, col_timestamp timestamp(9));

Table created

SQL> insert into test_timestamp1 values(sysdate, systimestamp);

1 row inserted

SQL> select dump(col_date) from test_timestamp1;

DUMP(COL_DATE)

--------------------------------------------------------------------------------

Typ=12 Len=7: 120,108,6,27,17,36,40

SQL> select dump(col_timestamp) from test_timestamp1;

DUMP(COL_TIMESTAMP)

--------------------------------------------------------------------------------

Typ=180 Len=11: 120,108,6,27,17,36,40,17,249,15,24

现在可以看到timestamp(9)占用了11个字节的空间。后面额外的四个字节包括了小数秒数。

3.3.2 TIMESTAMP 相减

将两个Date相减的结果是一个number.而将两个timestamp相减的结果是一个INTERVAL值

SQL> create table test_timestamp2(time1 timestamp(9), time2 timestamp(9));

Table created

SQL> insert into test_timestamp2 values(to_timestamp('2008-06-29

01:02:01.100000','yyyy-mm-dd hh24:mi:ss.ff'),to_timestamp('2008-07-29 02:03:02.000000','yyyy-mm-dd hh24:mi:ss.ff'))

2 ;

1 row inserted

SQL> select time2 - time1 from test_timestamp2;

TIME2-TIME1

---------------------------------------

+000000030 01:01:00.900000000

结果表示两个时间之间相隔的天数,小时数,分数,秒数.

相差30天1小时1分0.9秒

有时我们需要得到两个时间之前相关的年数和月数.

SQL> select numtoyminterval(months_between(time2,time1),'month')

years_months, time2 -

2 add_months(time1 , trunc(months_between(time2,time1))) days_hours from test_timestamp2;

YEARS_MONTHS DAYS_HOURS

---------------------------------------

---------------------------------------

+000000000-01 +000000000 01:01:01.000000000

在计算时,分,秒间隔时我们注意到,使用add_months之后,小数秒就丢掉了.

如果要保留集小数秒,我们就需要使用numtoyminterval函数

SQL> select numtoyminterval(months_between(time2,time1),'month')

years_months, time2 -(time1 +

numtoyminterval(trunc(months_between(time2,time1)),'month'))

day_hours from test_timestamp2;

YEARS_MONTHS DAY_HOURS

---------------------------------------

---------------------------------------

+000000000-01 +000000000 01:01:00.900000000

§3.4 TIMESTAMP WITH TIME ZONE

TIMESTAMP WITH TIME ZONE类型是TIMESTAMP的子类型,增加了时区支持。SQL> create table test_timezone(col_ts timestamp, col_tz timestamp with time zone);

Table created

SQL> insert into test_timezone values(systimestamp, systimestamp);

1 row inserted

SQL> select dump(col_tz) from test_timezone;

DUMP(COL_TZ)

--------------------------------------------------------------------------------

Typ=181 Len=13: 120,108,6,27,9,55,24,43,209,96,112,28,60

SQL> select dump(col_ts) from test_timezone;

DUMP(COL_TS)

--------------------------------------------------------------------------------

Typ=180 Len=11: 120,108,6,27,17,55,24,43,209,96,112

占用13字节的存储空间,最后两位用于保存时区信息。

在timestamp类型中,对时,分,秒的存储采用了加1法。

在timestamp with time zone上执行timestamp运算时,oracle自动把两个类型首先转换为UTC时间,然后再执行运算。

§3.5 TIMESTAMP WITH LOCAL TIME ZONE

这个类型保存进数据库时会先转换成数据库时区再进行保存.

SQL> create table test_timeltz(col_date date, timetz timestamp with time zone, timeltz timestamp with local time zone);

Table created

SQL> insert into test_timeltz values(timestamp'2008-06-29 12:03:22.111 US/Pacific',timestamp'2008-06-29 12:03:22.111

US/Pacific',timestamp'2008-06-29 12:03:22.111 US/Pacific');

1 row inserted

SQL> select dbtimezone from dual;

DBTIMEZONE

----------

+08:00

SQL> select * from test_timeltz;

COL_DATE TIMETZ TIMELTZ

-----------

--------------------------------------------------------------------------------

--------------------------------------------------------------------------------

2008-6-29 1 2008-06-29 12:03:22.111000

US/PACIFIC 2008-06-30

03:03:22.111000

SQL> select dump(col_date), dump(timetz), dump(timeltz) from

test_timeltz;

DUMP(COL_DATE) DUMP(TIMETZ) DUMP(TIMELTZ)

--------------------------------------------------------------------------------

--------------------------------------------------------------------------------

--------------------------------------------------------------------------------

Typ=12 Len=7:

120,108,6,29,13,4,23 Ty p=181 Len=13:

120,108,6,29,20,4,23,6,157,185,192,137,156 Typ= 231 Len=11: 120,108,6,30,4,4,23,6,157,185,192

请注意:

第一列,类型为date,只存储了日期和时间.时区和小数秒已经丢失了.不会执行时区转换.

第二列:类型为timestamp with time zone.保留了时区信息.并规范化了该时区相应的UTC时间.

第三列:类型为timestamp with local time zone.进行了转换,把插入的时间转为了数据库时区的时间.

timestamp with local time zone也是不需要记录时区信息的.它占用7-11个字节.

一旦你的数据表中有一列使用了timestamp with local time zone,你就不能再改变数据库时区.

通用协调时(UTC, Universal Time Coordinated) ,UTC与格林尼治平均时(GMT, Greenwich Mean Time)一样,都与英国伦敦的本地时相同. 北京时区是东八区,

领先UTC八个小时

§3.6 INTERVAL

用于表示一段时间或一个时间间隔的方法.在前面有多次提过.INTERVAL有两种

类型.

YEAR TO MONTH 能存储年或月指定的一个时间段.

DATE TO SECOND存储天,小时,分钟,秒指定的时间段.

在前面用到的两个函数numtoyminterval 和numtodsinterval就是创建

interval最好的方法.

另外extract 函数可以很容易的获得时间的每个部分.

SQL> select extract(day from time2-time1) day, extract(hour from time2 - time1) hour,

2 extract (minute from time2 - time1) minute,extract (second from time2 - time1) second from

3 test_timestamp2;

DAY HOUR MINUTE SECOND

---------- ---------- ---------- ----------

30 1 1 0.9

3.6.1 Interval year to month

语法:

Interval year(n) to month

N表示年数的位数.取值:0~9 .默认为2,表示年数为0 ~ 99

如果要产生一个1年2个月的时间段.用numtoyminterval是最方便的.

SQL> select (numtoyminterval(1,'year') + numtoyminterval(2,'month')) yminterval from dual;

YMINTERVAL

---------------------------------------

+000000001-02

或者是:

SQL> select numtoyminterval(1 * 12 + 2,'month') yminterval from dual;

YMINTERVAL

---------------------------------------

+000000001-02

另外可以使用to_yminterval(‘1-2’)函数来进行转换.

SQL> create table test_intervarym(col_interval interval year to month);

Table created

SQL> insert into test_intervarym values ( numtoyminterval(1 * 12 +

2,'month'));

1 row inserted

SQL> select * from test_intervarym;

COL_INTERVAL

---------------------------------------

+01-02

SQL> select dump(col_interval) from test_intervarym;

DUMP(COL_INTERVAL)

--------------------------------------------------------------------------------

Typ=182 Len=5: 128,0,0,1,62

INTERVAL year to month 采用固定5个字节进行存储.最后一位为天数值.采用加60算法.所以计算是需要减去60.

第一位为标志位,标志是否为正负数.

第二到第四位表示年数.

第五位表示日数

3.6.2 INTERVAL DAY TO SECOND

定义如下:

INTERVAL DAY(n) to second(m)

N为可选位数,表示天数的位数.可取值0~9,默认为2位.

M是秒字段小时的位数.取值0~9,默认为6

SQL> create table test_intervalds(col_ds interval day(9) to second(9));

Table created

SQL> insert into test_intervalds values(numtodsinterval(1,'second'));

1 row inserted

SQL> insert into test_intervalds

values(numtodsinterval(1.000000001,'second'));

1 row inserted

SQL> select col_ds, dump(col_ds) from test_intervalds;

COL_DS DUMP(COL_DS)

---------------------------------------

---------------------------------------------------------------------

-----------

+000000000 00:00:01.000000000 Typ=183 Len=11: 128,0,0,0,60,60,61,128,0,0,0

+000000000 00:00:01.000000001 Typ=183 Len=11: 128,0,0,0,60,60,61,128,0,0,1

可见,这种类型也是采用固定11个字节来存储的.

第一位为标志位,区分正负数

第二到第四位表示天数.

第五位表示小时数.时,分,秒采用加60算法

第六位表示分钟数,

第七位表示秒数.

最后四位表示小数秒数.

SELECT

FROM dual;

ADD_MONTH

---------

01-FEB-08

下面这个例子从2008年1月1日中减去13个月;注意本例实际上是使用A DD_MONTHS 函数在这个日期上加上-13个月:

SELECT ADD_MONTHS('01-JAN-2008', -13)

FROM dual;

ADD_MONTH

---------

01-DEC-06

ADD_MONTHS函数可以用于时间和日期。例如,下面这个查询在时间值2007年1月1日下午7点15分26秒上增加两个月:

SELECT ADD_MONTHS(TO_DATE('01-JAN-2007 19:15:26',

'DD-MON-YYYY HH24:MI:SS'), 2)

FROM dual;

ADD_MONTH

---------

01-MAR-07

下面这个查询重写了上面这个例子:它使用TO_CHAR函数将从ADD_MONTHS 函数中返回的时间值转换为字符串,并指定格式为DD-MON-YYYY HH24:MI:SS:SELECT TO_CHAR(ADD_MONTHS(TO_DATE('01-JAN-2007 19:15:26', 'DD-MON-YYYY HH24:MI:SS'), 2), 'DD-MON-YYYY HH24:MI:SS')

FROM dual;

TO_CHAR(ADD_MONTHS(T

--------------------

01-MAR-2007

19:15:26

注意:

表5-6中列出的所有函数都既可以用于时间,又可以用于日期。 5.5.2 LAST_DAY 函数

LAST_DAY 函数用于计算包含x 的月的最后一天。下面这个例子显示了2008年1月的最后一天:

SELECT LAST_DAY('01-JAN-2008')

FROM dual;

LAST_DAY(

---------

31-JAN-08

5.5.3 MONTHS_BETWEEN 函数

MONTHS_BETWEEN (x, y)用于计算x 和y 之间有几个月。如果x 在日历中比y 早,那么MONTHS_BETWEEN()就返回一个负数。

注意:

在调用MONTHS_BETWEEN 函数时,日期的次序非常重要:如果想让结果为正数,稍晚

的时间必须出现在前面。

下面这个例子显示了2008年5月25日和2008年1月15日之间相差的月数。注意由于第一个参数是稍后的日期(2005年5月25日),因此所返回的结果是正数:

SELECT MONTHS_BETWEEN('25-MAY-2008', '15-JAN-2008')

FROM dual;

MONTHS_BETWEEN('25-MAY-2008','15-JAN-2008')

-------------------------------------------

4.32258065

下面这个例子调用MONTHS_BETWEEN函数时使用相同的日期,但是颠倒了这两个参数的次序,因此返回值为负数:

SELECT MONTHS_BETWEEN('15-JAN-2008', '25-MAY-2008')

FROM dual;

MONTHS_BETWEEN('15-JAN-2008','25-MAY-2008')

-------------------------------------------

-4.3225806

5.5.4 NEXT_DAY函数

NEXT_DAY(x, day)用于计算从x开始,下一个day的日期;参数day是一个文本字符串,例如SATURDAY。

下面这个例子显示了2008年1月1日之后的下一个星期六的日期:

SELECT NEXT_DAY('01-JAN-2008', 'SATURDAY')

FROM dual;

NEXT_DAY(

---------

05-JAN-08

5.5.5 ROUND函数

ROUND(x [, unit])用于对x取整。默认情况下,x取整为最近的一天。uni t是一个可选字符串参数,它指明要取整的单元。例如,YYYY表示将x取整为最近一年的第一天。前面表5-2中列出的大部分参数都可以用来对时间值取整。

下面这个例子使用ROUND函数对2008年10月25日取整,取整为最近一年的第一天,因此结果是2009年1月1日。注意本例中指定的日期是25-OCT-200 8,并对它使用一个TO_DATE函数进行了转换:

SELECT ROUND(TO_DATE('25-OCT-2008'), 'YYYY')

FROM dual;

ROUND(TO_

---------

01-JAN-09

下面这个例子使用ROUND函数对2008年5月25日取整,取整为最近一月的第一天,最终结果是2008年6月1日,因为5月25日距6月1日比距5月1日近得多:

SELECT ROUND(TO_DATE('25-MAY-2008'), 'MM')

FROM dual;

ROUND(TO_

---------

01-JUN-08

下面这个例子对2008年5月25日晚上7点45分26秒取整,取整为最近的小时,因此是晚上8点整:

SELECT TO_CHAR(ROUND(TO_DATE('25-MAY-2008 19:45:26',

'DD-MON-YYYY HH24:MI:SS'), 'HH24'), 'DD-MON-YYYY HH24:MI:SS')

FROM dual;

TO_CHAR(ROUND(TO_DAT

--------------------

25-MAY-2008 20:00:00

5.5.6 SYSDATE

SYSDATE返回数据库服务器的操作系统中设置的当前时间值。下面这个例子获取当前日期:

SELECT SYSDATE

FROM dual;

SYSDATE

---------

05-NOV-07

5.5.7 TRUNC函数

TRUNC(x [, unit])用于对x截断。默认情况下,x被截断为当天的开始时间。unit是一个可选字符串参数,它指明要截断的单元。例如,MM表示截断为该月的第一天。前面表5-2中列出的大部分参数都可以用来对时间值进行截断。

下面这个例子使用TRUNC函数对2008年5月25日进行截断,截断为当年的第一天,因此结果是2008年1月1日:

SELECT TRUNC(TO_DATE('25-MAY-2008'), 'YYYY')

FROM dual;

TRUNC(TO_

---------

01-JAN-08

下面这个例子对2008年5月25日进行截断,截断为当月的第一天,最终结果是2008年5月1日:

SELECT TRUNC(TO_DATE('25-MAY-2008'), 'MM')

FROM dual;

TRUNC(TO_

---------

01-MAY-08

下面这个例子对2008年5月25日晚上7点45分26秒进行截断,截断为小时,因此是晚上7点整:

SELECT TO_CHAR(TRUNC(TO_DATE('25-MAY-2008 19:45:26',

'DD-MON-YYYY HH24:MI:SS'), 'HH24'), 'DD-MON-YYYY HH24:MI:SS')

FROM dual;

TO_CHAR(TRUNC(TO_DAT

--------------------

25-MAY-2008 19:00:00

oracle数据类型及其隐式转换

备注:转换时要根据给定的string设定正确的格式掩码,否则 Ora_01840:input value is not long enough for date format. Ora_01862:the numeric value does not match the length of the format item. 3) to_number 字符值->数字值 语法:to_number (string,[format mask],[nls_parameters]) 参数:string 待转换的字符值 format mask:可选参数 格式掩码同to_char转换为number时相同。 备注:如果使用较短的格式掩码就会返回错误。 例如: to_number(123.56,’999.9’)返回错误。 在oracle中,如果不同的数据类型之间关联,如果不显式转换数据,则它会根据以下规则对数据进行隐式转换 1) 对于INSERT和UPDATE操作,oracle会把插入值或者更新值隐式转换为字段的数据类型。假如id列的数据类型为number update t set id='1'; -> 相当于update t set id=to_number('1'); insert into t(id) values('1') -> insert into t values(to_number('1')); 2) 对于SELECT语句,oracle会把字段的数据类型隐式转换为变量的数据类型。 如假设id列的数据类型为varchar2 select * from t where id=1; -> select * from t where to_number(id)=1; 但如果id列的数据类型为number,则 select * from t where id='1'; -> select * from t where id=to_number('1');(参考下文) 3) 当比较一个字符型和数值型的值时,oracle会把字符型的值隐式转换为数值型。 如假设id列的数据类型为number select * from t where id='1'; -> select * from t where id=to_number('1');

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)),'

Oracle数据库的空间数据类型

Oracle数据库中空间数据类型随着GIS、CAD/CAM的广泛应用,对数据库系统提出了更高的要求,不仅要存储大量空间几何数据,且以事物的空间关系作为查询或处理的主要内容。Oracle数据库从9i开始对空间数据提供了较为完备的支持,增加了空间数据类型和相关的操作,以及提供了空间索引功能。 Oracle的空间数据库提供了一组关于如何存储,修改和查询空间数据集的SQL schema与函数。通过MDSYS schema规定了所支持的地理数据类型的存储、语法和语义,提供了R-tree空间数据索引机制,定义了关于空间的相交查询、联合查询和其他分析操作的操作符、函数和过程,并提供了处理点,边和面的拓扑数据模型及表现网络的点线的网络数据模型。 Oracle中各种关于空间数据库功能主要是通过Spatial组件来实现。从9i版本开始,Oracle Spatial空间数据库组件对存储和管理空间数据提供了较为完备的支持。其主要通过元数据表、空间数据字段(即SDO_GEOMETRY字段)和空间索引来管理空间数据,并在此基础上提供一系列空间查询和空间分析的函数,让用户进行更深层次的GIS应用开发。Oracle Spatial使用空间字段SDO_GEOMETRY存储空间数据,用元数据表来管理具有SDO_GEOMETRY字段的空间数据表,并采用R树索引和四叉树索引技术来提高空间查询和空间分析的速度。 1、元数据表说明。 Oracle Spatial的元数据表存储了有空间数据的数据表名称、空间字段名称、空间数据的坐标范围、坐标参考信息以及坐标维数说明等信息。用户必须通过元数据表才能知道ORACLE数据库中是否有Oracle Spatial的空间数据信息。一般可以通过元数据视图(USER_SDO_GEOM_METADATA)访问元数据表。元数据视图的基本定义为: ( TABLE_NAME V ARCHAR2(32), COLUMN_NAME V ARCHAR2(32), DIMINFO MDSYS.SDO_DIM_ARRAY, SRID NUMBER

数据库日期格式处理(Oracle)

TO_DATE格式(以时间:2007-11-02 13:45:25为例) Year: yy two digits 两位年显示值:07 yyy three digits 三位年显示值:007 yyyy four digits 四位年显示值:2007 Month: mm number 两位月显示值:11 mon abbreviated 字符集表示显示值:11月,若是英文版,显示nov month spelled out 字符集表示显示值:11月,若是英文版,显示november Day: dd number 当月第几天显示值:02 ddd number 当年第几天显示值:02 dy abbreviated 当周第几天简写显示值:星期五,若是英文版,显示fri day spelled out 当周第几天全写显示值:星期五,若是英文版,显示friday ddspth spelled out, ordinal twelfth Hour: hh two digits 12小时进制显示值:01 hh24 two digits 24小时进制显示值:13 Minute: mi two digits 60进制显示值:45 Second: ss two digits 60进制显示值:25 其它 Q digit 季度显示值:4 WW digit 当年第几周显示值:44 W digit 当月第几周显示值:1 24小时格式下时间范围为: 0:00:00 - 23:59:59.... 12小时格式下时间范围为: 1:00:00 - 12:59:59 .... 1. 日期和字符转换函数用法(to_date,to_char) select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') as nowTime from dual; //日期转化为字符串 select to_char(sysdate,'yyyy') as nowYear from dual; //获取时间的年 select to_char(sysdate,'mm') as nowMonth from dual; //获取时间的月 select to_char(sysdate,'dd') as nowDay from dual; //获取时间的日

oracle处理日期时间

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,

ORACLE时间函数

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

oracle数据库浅析number类型的值

number数据内部存储时,以变长的数组来存放,数组里的每个元素占一个字节,最多20个元素。内部代码为2。number数据的存放格式为:<[length]>,sign bit/exponent,digit1,digit2,…,digit20 sign bit/exponent这部分叫做exponent byte。 exponent byte包括三部分: ?sign bit:这表示高位bit,也就是128。并且我们有: 1. 如果小于128,则数值为负数。 2. 如果大于等于128,则数值为正数或0。 ?offset,始终为65 ?exponent:其范围从-65到62。该部分的值是基于100而 进行的科学计数法。 为0时比较特殊,就只有sign bit而没有offset和exponent,也就是128。比如: SQL> select dump(0) from dual; DUMP(0) ---------------- Typ=2 Len=1: 128 来看一个非0的值: SQL> select dump(25,16) from dual; DUMP(25,16) ------------------ Typ=2 Len=2: c1,1a 则exponent byte为c1,也就是 SQL> select to_number('c1','xx'),to_number('1a','xx') from dual; TO_NUMBER('C1','XX') TO_NUMBER('1A','XX') -------------------- -------------------- 193 26 而193=128+65+0,也就是sign bit为128,offset为65,exponent为0。 同时,oracle存储时,用1表示0,2表示1,依此类推。也就是说用显示的值减1就是实际的值。如下所示: SQL> select dump(1,16) from dual;

关于Oracle日期格式

Oracle关于日期时间 一.问题描述 我安装的数据库日期Date格式默认为’DD-M-YYYY(2-2月-1988)’,而数据库默认的格式一般都是’DD-MON-YYYY’,现在需要把日期格式改成数据库原本默认的格式 二.处理方式 修改注册表: 1.在注册表的KEY_LOCAL_MACHINE->SOFTWARE->ORACLE->HOME0 2.找到:NLS_LANG 如果这个不是’American’,要设置成英文(我原来安装的时候选的是简体中文,NLS_LANG的值是:SIMPLIFIED CHINESE_CHINA.ZHS16GBK) 3.新建一个字符串,命名为NLS_DA TE_FORMA T,然后值填上想要的默认格式,例如:YYYY-MM-DD HH24:MI:SS

4.第三方的工具显示的日期格式有时候和数据库默认的不通,工具里面的格式是受工具影响的,如果想要改变PLSQL Developer里面的日期显示格式,可以这样改: PL/SQL DEVELOPER需要在Tools->Preferences->User Interface->Date/Time下修改格式即 可: 如修改参数文件的话。可直接在参数文件中添加:

NLS_DATA_FORMAT=YYYY-MM-DD-HH24:MI:SS,但须将注册表中上述位置的NLS_LANG字串值去掉。 三.常用的命名 1.可以用下面的命令来修改一个会话的日期格式,断开与数据库的连接时,会话结束, 所有的修改都会丢失 alter session set nls_date_format='yyyy-mm-dd' 2. 查看日期格式命名:show parameter nls_date_format 3. 查看参数设置:select * from nls_session_parameters 4.求某天是星期几select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day') from dual; 5.求当前是星期几:select to_char(sysdate, 'day') from dual 6. 一年的第几天:select TO_CHAR(SYSDA TE,'DDD'),sysdate from dual 参考网址:https://www.360docs.net/doc/616740337.html,/397879213/archive/2010/12/29/341925.html https://www.360docs.net/doc/616740337.html,/gudufeiyang/article/details/5938885 2011年7月9日星期六 ___LiBo整理

Oracle基础知识大全,

课程目标: 1. 了解数据库系统在项目开发中的地位 2. 了解目前主流数据库系统 3. 熟练掌握查询命令 4. 熟练掌握数据操作方式 5. 熟练使用数据库内置函数 6. 掌握pl/sql程序设计语法结构 7. 掌握视图 8. 掌握存储过程 9. 掌握用户自定义函数 10. 掌握触发器 了解: 1.数据库组件: 1.1 实施应用集群 1.2 Oracle OLAP 1.3 数据挖掘 1.4 应用程序接口 1.5 网络组件 1.6 SQL Plus 1.7 企业管理器OEM

2. 几个版本间的差异: 2.1 增加了服务器参数文件SPFILE 2.2 使用了OMF免去了手工管理数据库文件的繁琐 2.3 支持多种数据库块大小 2.4 会话可以自动调整PGA的大小 2.5 引入了列表分区 课程内容: 1. 操作数据之前的准备工作: 1.1. 要保证有一个数据库: 1.2. 要保证创建一个表空间 create tablespace hbjr datafile 'E:\dbs\hbjr.dbf' size 100M; 1.3. 要创建一个用户,用户默认的表空间就是你创建的表空间 create user hbjr identified by orcl default tablespace hbjr; //授权限: grant dba to hbjr; 1.4. 用户/密码登录:

2. 表名/列字段名起名规范: 2.1 使用常规字母和数字 2.2 长度不要超过30 2.3 表名/列名不能重复 2.4 不能使用oracle的保留字 3. 数据类型 3.1 char:定长,存储单位--字节(bite) 3.2 varchar2:变长,存储单位--字节 3.3 nchar:定长,存储单位--字符 3.4 nvarchar2:变长,存储单位--字符 3.5 date:日期类型,7个字节,存储着--世纪,年,月,日,时,分,秒 3.6 timestamp:日期类型,11个字节,存储着--世纪,年,月,日,时,分,秒,毫秒 3.7 number:数据类型(数值类型) 3.8 clob:大字段类型,适合存储纯文本信息(例如:*.txt 文件)

oracle日期处理全集__日期加减全活儿

1、add_months(d,n) 日期d加n个月 SQL> SELECT SYSDA TE AS This_Day,add_months(SYSDATE,1) AS Next_Day FROM dual; THIS_DAY NEXT_DAY -------------- ------------ 08-9月-10 08-10月-10 2、last_day(d) 包含d的月份的最后一天的日期 SQL> select last_day(sysdate) as last_day from dual; LAST_DAY ----------- 30-9月-10 3、new_time(d,a,b) 时区的日期和时间d在b时区的日期和时间 SQL> select to_char(sysdate,'YYYY-MM-DD HH24:MI:SS') as china, to_char(new_time(sysdate,'est','GMT'),'YYYY-MM-DD HH24:MI:SS') as GMT from dual; CHINA GMT ------------------- ------------------- 2010-09-08 09:51:50 2010-09-08 14:51:50 4、next_day(d,day) 比日期d晚,由day指定的周几的日期 SQL> select sysdate as this_day, next_day(sysdate,7) as next_sat from dual; THIS_DAY NEXT_SAT -------------- -------------- 08-9月-10 11-9月-10 N天前的日期: SQL> select to_date(to_char(sysdate-5, 'yyyy-MM-dd'), 'yyyy-MM-dd') from dual; 5、sysdate 当前的系统日期和时间 6、greatest(d1,d2,...dn) 给出的日期列表中最后的日期 SQL> select sysdate as this_day,greatest(sysdate,sysdate+1,sysdate+2) as max_day from dual; THIS_DAY MAX_DAY -------------- -------------- 08-9月-10 10-9月-10 7、least(d1,k2,...dn) 给出的日期列表中最早的日期 SQL> select sysdate as this_day,least(sysdate,sysdate+1,sysdate-1) as min_day from dual; THIS_DAY MIN_DAY -------------- -------------- 08-9月-10 07-9月-10 8、to_char(d [,fmt]) 日期d按fmt指定的格式转变成字符串 SQL> select to_char(sysdate,'YYYY-MM-DD HH24:MI:SS') as today from dual; TODAY -------------------

Oracle中日期,时间查询

Oracle中日期,时间查询 在注册表\hkey_local_machine\software\oracle\home0主键中增加一个字串(8i版本),字串名为nls_date_format,字串的值为你希望定义的时间格式,如:yyyy-mm-dd hh24:mi:ss to_date('2007-08-25 19:31:00','yyyy-mm-dd hh24:mi;ss') 在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小时格式下时间范围为: 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 设置日期语言

Oracle数据库基本数据类型

oracle基本数据类型

oracle 数据库中讨论char ,varchar ,varchar2 数据类型! 这3种字符串数据类型是我们使用最多的,我们在数据库设计时到底该怎么使用了? 首先我们先来分析3个数据类型的说明: 1。char CHAR的长度是固定的,最长2000个字符。 2。varchar 和 varchar2 可以肯定的是oracle中目前是可以使用varchar数据类型的,但他们的区别我查了不少资料也没有找到一个准确的答案最常见的说话是说oracle中的varchar只是varchar2的别名也就是同义词。 其次也有人认为varchar是最大长度为2000的可变字符串(和sql server中的varchar一致),而varchar2最大长度为4000。 知道了他们的特点我们就来讨论下使用区别 1.char和varchar、varchar2 由于varchar和varchar2用途类似,我们先来讨论char和他们的使用区别: varchar和varchar2比char节省空间,在效率上比char会稍微差一些,即要想获得效率,就必须牺牲一定的空间,这也就是我们在数据库设计上常说的

‘以空间换效率’。 varchar和varchar2虽然比char节省空间,但是如果一个varchar和varchar2列经常被修改,而且每次被修改的数据的长度不同,这会引起‘行迁移’(Row Migration)现象,而这造成多余的I/O,是数据库设计和调整中要尽力避免的,在这种情况下用char代替varchar和varchar2会更好一些。 当然还有一种情况就是象身份证这种长度几乎不变的字段可以考虑使用char,以获得更高的效率。 2。varchar和varchar2 这里就进入重点了,前面的区别我们在sql server中我们已经基本了解了,大家可能都知道,最多也就是复习下,但oracle增加了一个varchar2类型,是大家以前所没有用到过的。 因为oracle保证在任何版本中该数据类型向上和向下兼容,但不保证varchar,还有其他数据中一般都有varchar这个数据类型。 所以我得出了以下结论: 如果想在oracle新版本的数据库兼容就不要用varchar,如果想和oracle 之外其他数据库兼容就不要用varchar2。 ORACLE中的数据类型分类 ORACLE中的数据类型不可谓不多,下面把我这两天来的学习体会写一下吧! 1、字符数据类型:包括我CHAR,VARCHAR2,LONG。 CHAR型可以存储字母数字值,这种数据类型的 列长度可以是1到2000个字节。如果未指明,则默认其占用一个字节,如果用户输入的值小于指定的长度,数据库则用空格填充至固定长度。 VARCHAR2型其实就是VARCHAR,只不过后面多了一个数字2,VARCHAR2就是VARCHAR的同义词,也称别名。数据类型大小在1至4000个字节,但是和CHAR不同的一点是:当你定义了VARCHAR2长度为30,但是你只输入了10个字符,这时VARCHAR2不会像CHAR一样填充,在数据库中只有10具字节。

Oracle中trunc()函数用法处理日期、数字类型数据

trunc()函数用法处理日期、数字类型数据 一、日期 TRUNC函数为指定元素而截去的日期值。 其具体的语法格式如下: TRUNC(date[,fmt]) 其中:date 一个日期值 fmt 日期格式,该日期将由指定的元素格式所截去。忽略它则由最近的日期截去如果当日日期是:2011-3-18 1.select trunc(sysdate) from dual --2011-3-18 今天的日期为2011-3-18 2.select trunc(sysdate, 'mm') from dual --2011-3-1 返回当月第一天. 3.select trunc(sysdate,'yy') from dual --2011-1-1 返回当年第一天 4.select trunc(sysdate,'dd') from dual --2011-3-18 返回当前年月日 5.select trunc(sysdate,'yyyy') from dual --2011-1-1 返回当年第一天 6.select trunc(sysdate,'d') from dual --2011-3-13 (星期天)返回当前星期的第一天 7.select trunc(sysdate, 'hh') from dual --2011-3-18 14:00:00 当前时间为14:41 8.select trunc(sysdate, 'mi') from dual --2011-3-18 14:41:00 TRUNC()函数没有秒的精确 二、数字 TRUNC(number,num_digits) Number 需要截尾取整的数字。 Num_digits 用于指定取整精度的数字。Num_digits 的默认值为0。 TRUNC()函数截取时不进行四舍五入 9.select trunc(123.458) from dual --123 10.select trunc(123.458,0) from dual --123 11.select trunc(123.458,1) from dual --123.4 12.select trunc(123.458,-1) from dual --120 13.select trunc(123.458,-4) from dual --0 14.select trunc(123.458,4) from dual --123.458 15.select trunc(123) from dual --123 16.select trunc(123,1) from dual --123 17.select trunc(123,-1) from dual --120

Oracle 中的日期格式转化

Oracle 中的TO_DATE 和TO_CHAR 函数日期处理 Oracle 中的 TO_DATE 和TO_CHAR函数 oracle 中 TO_DATE 函数的时间格式,以 2008-09-10 23:45:56 为例 格式说明显示值备注 Year(年): yy two digits(两位年) 08 yyy three digits(三位年) 008 yyyy four digits(四位年) 2008 Month(月): mm number(两位月) 09 mon abbreviated(字符集表示) 9月若是英文版, 则显示 sep month spelled out(字符集表示) 9月若是英文版, 则显示 september Day(日): dd number(当月第几天) 10 ddd number(当年第几天) 254 dy abbreviated(当周第几天简写) 星期三若是英文版, 则显示 wed day spelled out(当周第几天全写) 星期三若是英文版, 则显示 wednesday ddspth spelled out, ordinal twelfth tenth Hour(时): hh two digits(12小时进制) 11 hh24 two digits(24小时进制) 23 Minute(分): mi two digits(60进制) 45 Second(秒): ss two digits(60进制) 56 其他: Q digit(季度) 3 WW digit(当年第几周) 37 W digit(当月第几周) 2 说明: 12小时格式下时间范围为: 1:00:00 - 12:59:59(12 小时制下的 12:59:59 对应 24 小时制下的 00:59:59) 24小时格式下时间范围为: 0:00:00 - 23:59:59 1. 日期和字符转换函数用法(to_date,to_char) select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') as nowTime from dual; //日期转化为字符串

Oracle TO_DATE 日期格式大全

Oracle TO_DATE 日期格式大全 Oracle中TO_DATE格式2009-04-14 10:53TO_DATE格式(以时 间:2007-11-02 13:45:25为例) Year: yy two digits 两位年显示值:07 yyy three digits 三位年显示值:007 yyyy four digits 四位年显示值:2007 Month: mm number 两位月显示值:11 mon abbreviated 字符集表示显示值:11月,若是英文版,显示nov month spelled out 字符集表示显示值:11月,若是英文版,显示november Day: dd number 当月第几天显示值:02 ddd number 当年第几天显示值:02 dy abbreviated 当周第几天简写显示值:星期五,若是英文版,显示fri day spelled out 当周第几天全写显示值:星期五,若是英文版,显示friday ddspth spelled out, ordinal twelfth Hour: hh two digits 12小时进制显示值:01

hh24 two digits 24小时进制显示值:13 Minute: mi two digits 60进制显示值:45 Second: ss two digits 60进制显示值:25 其它 Q digit 季度显示值:4 WW digit 当年第几周显示值:44 W digit 当月第几周显示值:1 24小时格式下时间范围为: 0:00:00 - 23:59:59.... 12小时格式下时间范围为: 1:00:00 - 12:59:59 .... 1. 日期和字符转换函数用法(to_date,to_char) select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') as nowTime from dual; //日期转化为字符串 select to_char(sysdate,'yyyy') as nowYear from dual; //获取时间的年 select to_char(sysdate,'mm') as nowMonth from dual; //获取时间的月

Oracle 月初月末的时间处理

Oracle 月初月末的时间处理 Oracle 月初月末的时间处理 -- 当前日期 SELECT TO_CHAR(ADD_MONTHS(SYSDATE, 0), 'yyyy-MM-dd') PRETODAY FROM DUAL -- 上月当前日期 SELECT TO_CHAR(ADD_MONTHS(SYSDATE, -1), 'yyyy-MM-dd') PRETODAY FROM DUAL -- 下月当前日期 SELECT TO_CHAR(ADD_MONTHS(SYSDATE, 1), 'yyyy-MM-dd') PRETODAY FROM DUAL -- 上月首天 SELECT TO_CHAR(ADD_MONTHS(LAST_DAY(SYSDATE) + 1, -2),'yyyy-MM-dd') FIRSTDAY FROM DUAL -- 上月月末 SELECT TO_CHAR(LAST_DAY(ADD_MONTHS(LAST_DAY(SYSD ATE) + 1, -2)),'yyyy-MM-dd') FIRSTDAY FROM DUAL -- 当月首天

SELECT TO_CHAR(ADD_MONTHS(LAST_DAY(SYSDATE) + 1, -1), 'yyyy-MM-dd') FIRSTDAY FROM DUAL -- 当月月末 SELECT TO_CHAR(LAST_DAY(ADD_MONTHS(LAST_DAY(SYSD ATE) + 1, -1)),'yyyy-MM-dd') FIRSTDAY FROM DUAL -- 下月首天 SELECT TO_CHAR(ADD_MONTHS(LAST_DAY(SYSDATE) + 1, 0), 'yyyy-MM-dd') FIRSTDAY FROM DUAL -- 下月月末 SELECT TO_CHAR(LAST_DAY(ADD_MONTHS(LAST_DAY(SYSD ATE) + 1, 0)), 'yyyy-MM-dd') FIRSTDAY FROM DUAL

Oracle与DB2数据类型的分类对应说明

Oracle与DB2数据类型的分类对应说明首先,通过下表介绍与DB2/400数据类型之间的对应关系,是一对多的关系,具体采用哪种对应关系,应具体问题具体分析。 注意事项: Oracle中的DATE含有年、月、日、时、分、秒,它和DB2/400中的DATE不相互对应,DB2/400中的DATE只有年、月、日,TIME类型含有时、分、秒,因此日期和时间类型要进行转换,

NUMBER Oracle中的NUMBER类型可以对应DB2/400中的很多类型,这种对应关系要依赖于Oracle中number将用于保存何种类型的数据,是整型还是带有小数位的实型数据,另外还要考虑类型所占用的存储空间,例如:SAMLLINT占2 byte, INTEGER占4 byte; BIGINT占8 byte;Oracle 中的NUMBER类型所占用的存储空间要根据它的定义而定,例如缺省精度下的NUMBER有38个数字长,占用20 byte的空间。具体的对应关系请参照上表。 ROW and LOB类型 DB2/400提供VARCHAR和CLOB与ORACLE中的RAW和LONG RAW相对应。ORACLE也支持大对象:BLOB、CLOB、CLOB和NCLOB, ORACLE中的BLOB和CLOB可以提供4GB的空间,而DB2/400中的BLOB和CLOB只能存放2GB的数据;DB2/400中的DBCLOB与ORACLE中的NCLOB 2GB相对应。Oracle 中的BFILE数据类型用于管理数据库以外的二进制数据,数据库中的表将指向数据库外部的存放的BFILE文件,DB2/400也提供一个类似的数据类型DATALINK相对应。 ROWID Oracle ROWIND虚拟列用于对表中的某一列进行唯一标示,DB2/400中也有这样的数据类型ROWID,它与ORACLE中的ROWID的功能相似。DB2/400中的ROWID可以存放40 byte的数据用来唯一标示表中的每一行,它没有ccsid属性,这些信息中没有关于datafile、 block 或row的信息。 例如: CREATE TABLE LIBRARYNAME/ORDERS2 (ORDERNO ROWID, SHIPPED_TO VARCHAR (36) , ORDER_DATE DATE) ORDERNO的数据类型为ROWID,用于存放订单号,每当插入一行时,系统自动生成一个值,存放进这个字段。可以用OPERATION NAVIGATOR查看它的内容。

相关文档
最新文档