您的位置:首页 > 数据库 > Oracle

45.Oracle数据库SQL开发之 日期和时间的存储与处理——使用时间戳

2015-11-09 22:06 639 查看
45.Oracle数据库SQL开发之 日期和时间的存储与处理——使用时间戳
欢迎转载,转载请标明出处: http://blog.csdn.net/notbaron/article/details/49745689

9i数据库引入了一种新特性,可以存储时间戳。时间戳可以存储世纪、四位年、月、日、时、分、秒。与DATE类型比,时间戳有以下优点:

n  时间戳可以存储秒的小数位

n  时间戳可以存储时区

1.  使用时间戳类型

1.1             使用TIMESTAMP类型

与其他类型类似,TIMESTAMP类型也可以用来在表中定义列。

CREATE TABLE purchases_with_timestamp (

 product_id INTEGER REFERENCES products(product_id),

 customer_id INTEGER REFERENCES customers(customer_id),

 made_on TIMESTAMP(4)

);

INSERT INTO purchases_with_timestamp (

 product_id, customer_id, made_on

) VALUES (

  1,1, TIMESTAMP '2005-05-13 07:15:31.1234'

);

查询如下:

store@PDB1> select * frompurchases_with_timestamp;

 

PRODUCT_ID CUSTOMER_ID MADE_ON

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

1                        1 13-MAY-05 07.15.31.1234 AM

1.2             使用TIMESTAMP WITH TIME ZONE类型

TIMESTAMP WITH TIME ZONE类型对TIMESTAMP进行了扩展,用于存储时区。

CREATE TABLE purchases_timestamp_with_tz (

 product_id INTEGER REFERENCES products(product_id),

 customer_id INTEGER REFERENCES customers(customer_id),

 made_on TIMESTAMP(4) WITH TIME ZONE

);

INSERT INTO purchases_timestamp_with_tz (

 product_id, customer_id, made_on

) VALUES (

  1,1, TIMESTAMP '2005-05-13 07:15:31.1234 -07:00'

);

查看如下内容:

store@PDB1> select * frompurchases_timestamp_with_tz;

 

PRODUCT_ID CUSTOMER_ID MADE_ON

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

          1          1 13-MAY-05 07.15.31.1234 AM -07:00

          1          2 13-MAY-05 07.15.31.1234 AM PST

1.3             使用TIMESTAMP WITH LOCAL TIME ZONE类型

TIMESTAMP WITH LOCAL TIME ZONE类型对TIMESTAMP进行了扩展,用于存储一个转换为数据库设置的本地时区的时间戳。如果企业已经实现了一个全球系统,可以通过世界各地访问,就应该使用TIMESTAMP WITH LOCAL TIME ZONE类型来存储时间戳。

CREATE TABLE purchases_with_local_tz (

 product_id INTEGER REFERENCES products(product_id),

 customer_id INTEGER REFERENCES customers(customer_id),

 made_on TIMESTAMP(4) WITH LOCAL TIME ZONE

);

INSERT INTO purchases_with_local_tz (

 product_id, customer_id, made_on

) VALUES (

  1,1, TIMESTAMP '2005-05-13 07:15:30 EST'

);

INSERT INTO purchases_with_local_tz (

 product_id, customer_id, made_on

) VALUES (

  2, 2,TIMESTAMP '2005-05-14 07:15:30 PST'

);

 

查看如下:

store@PDB1> select * from purchases_with_local_tz;

 

PRODUCT_ID CUSTOMER_ID MADE_ON

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

          2          2 14-MAY-05 09.15.30.0000 AM

          1          1 13-MAY-05 07.15.30.0000 AM

2.  与时间戳有关的函数

2.1         CURRENT_TIMESTAMP、LOCALTIMESTAMP和SYSTIMSTAMP

执行如下:

store@PDB1> selectcurrent_timestamp,localtimestamp,systimestamp from dual;

CURRENT_TIMESTAMP

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

LOCALTIMESTAMP

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

SYSTIMESTAMP

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

08-NOV-15 04.00.30.943720 PM -05:00

08-NOV-15 04.00.30.943720 PM

08-NOV-15 04.00.30.943702 PM -05:00

如果将TIME_ZONE设置为EST,

store@PDB1> alter session set time_zone='EST';

Session altered.

store@PDB1> selectcurrent_timestamp,localtimestamp,systimestamp from dual;

 

CURRENT_TIMESTAMP

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

LOCALTIMESTAMP

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

SYSTIMESTAMP

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

08-NOV-15 04.15.16.003530 PM EST

08-NOV-15 04.15.16.003530 PM

08-NOV-15 04.15.16.003520 PM -05:00

然后改回PST

store@PDB1> alter session set time_zone='PST';

 

Session altered.

2.2         EXTRACT函数

EXTRACT函数用于从x中提取并返回年、月、日、时、分、秒或时区。

store@PDB1> select extract(year fromto_date('01-jan-2008 19:15:26','dd-mon-yyyy hh24:mi:ss')) as year,

   extract(month from to_date('01-jan-2008 19:15:26','dd-mon-yyyyhh24:mi:ss')) as month,

   extract(day from to_date('01-jan-2008 19:15:26','dd-mon-yyyy hh24:mi:ss'))as day

   from dual;

 

     YEAR    MONTH       DAY

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

     2008         1              1

 

2.3         FROM_TZ()

FROM_TZ(x,time_zone)将TIMESTAMP类型的x转换为由time_zone指定的时区,并返回TIMESTAMPWITH TIMEZONE类型。TIME_ZONE必须被指定为+|- HH:MI格式的字符串。

store@PDB1> select from_tz(timestamp '2008-05-1307:15:31.1234','-7:00') from dual;

 

FROM_TZ(TIMESTAMP'2008-05-1307:15:31.1234','-7:00')

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

13-MAY-08 07.15.31.123400000 AM -07:00

2.4         SYS_EXTRACT_UTC()

SYS_EXTRACT_UTC(x)用于将TIMESTAMPWITH TIMEZONE类型的x转换为一个包含UTC时区日期和时间的TIMESTAMP类型。

执行如下:

store@PDB1> select sys_extract_utc(timestamp'2008-11-17 19:15:26 pst') from dual;

 

SYS_EXTRACT_UTC(TIMESTAMP'2008-11-1719:15:26PST')

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

18-NOV-08 03.15.26.000000000 AM

2.5         TO_TIMESTAMP()

TO_TIMESTAMP(x, [format])用于将字符串 x 转换为一个TIMESTAMP类型。

执行如下:

store@PDB1> select to_timestamp('2008-05-1307:15:31.1234','YYYY-MM-DD HH24:MI:SS.FF') from dual;

 

TO_TIMESTAMP('2008-05-1307:15:31.1234','YYYY-MM-DDHH24:MI:SS.FF')

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

13-MAY-08 07.15.31.123400000 AM

2.6         TO_TIMESTAMP_TZ()

TO_TIMESTAMP_TZ(x, [ format ])用于将字符串x转换为一个TIMESTAMP WITH TIMEZONE类型。

执行如下:

store@PDB1> select to_timestamp_tz('2008-05-1307:15:31.1234 PST', 'YYYY-MM-DD HH24:MI:SS.FF TZR') from dual;

 

TO_TIMESTAMP_TZ('2008-05-1307:15:31.1234PST','YYYY-MM-DDHH24:MI:SS.FFTZR')

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

13-MAY-08 07.15.31.123400000 AM PST

store@PDB1> select to_timestamp_tz('2008-05-13 07:15:31.1234 -7:00','YYYY-MM-DDHH24:MI:SS.FF TZH:TZM') from dual;

 

TO_TIMESTAMP_TZ('2008-05-1307:15:31.1234-7:00','YYYY-MM-DDHH24:MI:SS.FFTZH:

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

13-MAY-08 07.15.31.123400000 AM -07:00

2.7         将字符串转换为TIMESTAMP WITH LOCAL TIME ZONE

将CAST函数可以将一个字符串转换为TIMESTAMP WITH LOCAL TIME ZONE。

执行如下:

store@PDB1> select cast('13-JUN-08' as timestampwith local time zone) from dual;

 

CAST('13-JUN-08'ASTIMESTAMPWITHLOCALTIMEZONE)

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

13-JUN-08 12.00.00.000000 AM

使用CAST()将一个更复杂的字符串转换为TIMESTAMP WITH LOCAL TIME ZONE:

store@PDB1> selectcast(to_timestamp_tz('2008-05-13 07:15:31.1234 pst','yyyy-mm-dd hh24:mi:ss.fftzr') as timestamp with local time zone) from dual;

 

CAST(TO_TIMESTAMP_TZ('2008-05-1307:15:31.1234PST','YYYY-MM-DDHH24:MI:SS.FFT

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

13-MAY-08 07.15.31.123400 AM

store@PDB1> selectcast(to_timestamp_tz('2008-05-13 07:15:31.1234 est','yyyy-mm-dd hh24:mi:ss.fftzr') as timestamp with local time zone) from dual;

 

CAST(TO_TIMESTAMP_TZ('2008-05-1307:15:31.1234EST','YYYY-MM-DDHH24:MI:SS.FFT

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

13-MAY-08 05.15.31.123400 AM

 

 

 

 

 

 

 

 

 

 

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: