`

Oracle时间戳类型

阅读更多

 

 

    Oracle Databse 9i数据库引入了一种新特性,可以存储时间戳。时间戳可以存储世纪、4位年、月、日、时(以24小时格式)、分、秒。与DATE类型相比,时间戳具有以下优点:

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

    ● 时间戳可以存储时区。

    下面介绍时间戳类型。

 使用时间戳类型

    时间戳有3种类型,如表所示。

    表  时间戳类型

类    型 说    明
TIMESTAMP[(seconds_precision)] 存 储世纪、4位的年、月、日、时(以24小时格式)、分和秒。seconds_precision为可选参数,用于指定精度,该参数为一个整数,范围从 0~9,默认值为9;意思是表示秒的数字的小数点右边可以存储9位数字。如果试图在秒的小数中保存超过TIMESTAMP存储精度的数字,那么该小数将被 取整
TIMESTAMP[(seconds_precision)]WITH TIME ZONE 扩展TIMESTAMP,用于存储时区
TIMESTAMP[(seconds_precision)]WITH LOCAL TIME ZONE 扩展TIMESTAMP,将给定的时间值转换成数据库的本地时区。转换过程称为时间值的规格化(normalizing)

 

 

    接下来的几节将介绍如何使用这些时间戳。

1. 使用TIMESTAMP类型

    与其他类型类似,TIMESTAMP类型也可以用来在表中定义列。下面这个语句用于创建一个表purchases_with_timestamp, 该表用来存储顾客的购买记录。该表包含了一个TIMESTAMP类型的列made_on,该列用来记录顾客在何时购买了产品。注意TIMESTAMP的精 度设置为4(这意味着在秒的小数点右边可以存储4位小数):

 CREATE TABLE purchases_with_timestamp (
product_id INTEGER REFERENCES products(product_id),
customer_id INTEGER REFERENCES customers(customer_id),
made_on TIMESTAMP(4)
);
 

 

注意:

purchases_with_timestamp表由store_schema.sql脚本创建和填充。本章的其他表也是由该脚本创建,因此不需要输入CREATE TABLE语句或本章所示的任何INSERT语句。

要向数据库提供一个TIMESTAMP字面值,可以在一个时间值前面指定TIMESTAMP关键字,格式如下:

TIMESTAMP 'YYYY-MM-DD HH24:MI:SS.SSSSSSSSS'

     注意在小数点后面有9个S字符,这意味着可以在字符串中为秒的小数部分指定9个数字。TIMESTAMP列中可以实际存储多少位数字取决于在定义该列时为 秒的小数部分指定了多少位数字。例如,purchases_with_timestamp表的made_on列可以存储最多4位小数的秒数。如果试图向该 表中添加一行秒的精度超过4位小数的记录,小数部分就会被取整。例如:

 

2005-05-13 07:15:31.123456789

     将被取整为:

2005-05-13 07:15:31.1235
 

 

    下面这个INSERT语句向purchases_with_timestamp表中添加一行记录,注意此处使用了TIMESTAMP关键字指定一个时间值:

INSERT INTO purchases_with_timestamp (
product_id, customer_id, made_on
) VALUES (
1, 1, TIMESTAMP '2005-05-13 07:15:31.1234'
);
 

    下面这个查询对purchases_with_timestamp表进行检索:

 SELECT *
FROM purchases_with_timestamp;

PRODUCT_ID CUSTOMER_ID  MADE_ON
---------- -----------  --------------------------
1              1 13-MAY-05 07.15.31.1234 AM

 

2. 使用TIMESTAMP WITH TIME ZONE类型

TIMESTAMP WITH TIME ZONE类型对TIMESTAMP进行了扩展,用于存储时区。下面这个语句创建一个表purchases_timestamp_with_tz,该表用于 存储顾客的购买记录。该表包含了一个TIMESTAMP WITH TIME ZONE类型的列made_on,该列用来记录该顾客在何时购买了产品:

 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
);
 

要向数据库提供一个带有时区信息的时间戳,可以在TIMESTAMP子句中加上时区信息。例如,下面这个TIMESTAMP子句包含了时差-07:00:

 

 TIMESTAMP '2005-05-13 07:15:31.1234 -07:00'
此处也可以指定一个时区名,下面这个例子就指定PST作为时区使用:
TIMESTAMP '2005-05-13 07:15:31.1234 PST'
下面这个INSERT语句向purchases_timestamp_with_tz表中添加两行记录:
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'
);

INSERT INTO purchases_timestamp_with_tz (
product_id, customer_id, made_on
) VALUES (
1, 2, TIMESTAMP '2005-05-13 07:15:31.1234 PST'
);
 

下面这个查询对purchases_timestamp_with_tz表进行检索:

 SELECT *
FROM purchases_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

 

3. 使用TIMESTAMP WITH LOCAL TIME ZONE类型

TIMESTAMP WITH LOCAL TIME ZONE类型对TIMESTAMP进行了扩展,用于存储一个转换为数据库设置的本地时区的时间戳。在为一个TIMESTAMP WITH LOCAL TIME ZONE类型的列存储一个时间戳值时,这个时间戳就被转换(或被规格化)为数据库的时区设置。当检索这个时间戳时,它就被规格化为当前会话中的时区设置。

提示:

如果企业已经实现了一个全球系统,可以通过世界各地访问,那么就应该使用TIMESTAMP WITH LOCAL TIME ZONE类型来存储时间戳。这是因为数据库会将时间戳存储为数据库所在时区中的本地时间,但是在对它们进行检索时,却可以看到规格化为本地时区的时间戳。

假设数据库时区是PST(比UTC晚8个小时),想向数据库中存储下面的时间戳:

 

2005-05-13 07:15:30 EST

 

由于EST比UTC晚5个小时,因此EST与PST之间差3个小时(8 - 5 = 3)。要将前面的时间戳规格化为PST,就必须从时间戳中减去3个小时就得到下面的规格化的时间戳:

 

2005-05-13 04:15:30

 

这是数据库的TIMESTAMP WITH LOCAL TIME ZONE列中所存储的时间戳。

下面这个语句创建一个表purchases_ with_local_tz,该表用于存储顾客的购买记录。该表包含了一个TIMESTAMP WITH LOCAL TIME ZONE类型的列made_on,该列用来记录顾客在何时购买了产品:

 

 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语句向purchases_ with_local_tz表中添加一行记录,并将该行的made_on列值设置为2005-05-13 07:15:30 EST:

 

 INSERT INTO purchases_with_local_tz (
product_id, customer_id, made_on
) VALUES (
1, 1, TIMESTAMP '2005-05-13 07:15:30 EST'
);

 

虽然made_on列的时间戳设置为2005-05-13 07:15:30 EST,但数据库中实际存储的时间戳是2005-05-13 04:15:30(时间戳规格化为PST)。

下面这个查询对purchases_ with_local_tz表进行检索:

 SELECT *
FROM purchases_with_local_tz;

PRODUCT_ID  CUSTOMER_ID  MADE_ON
----------  -----------  --------------------------
1             1   13-MAY-05 04.15.30.0000 AM
 

因为我的数据库时区和会话时区都是PST,所以此查询返回的时间戳都是针对PST的。

警告:

前面这个查询返回的时间戳规格化为PST。如果数据库时区或会话时区不是PST,则运行查询时返回的时间戳会有所不同(它将规格化为您的时区)。

如果将当前会话的本地时区设置为EST,并重新执行上面这个查询,就会看到时间戳被规格化为EST:

 

 ALTER SESSION SET TIME_ZONE = 'EST';

Session altered.

SELECT *
FROM purchases_with_local_tz;

PRODUCT_ID CUSTOMER_ID  MADE_ON
---------- -----------  --------------------------
1             1   13-MAY-05 07.15.30.0000 AM

 

可以看到,此查询返回的时间戳是13-MAY-05 07.15.30.0000 AM,这是规格化为会话时区EST的时间戳。因为EST比PST早3小时,所以必须将13-MAY-05 04:15:30(数据库中存储的时间戳)增加3小时,得到13-MAY-05 07.15.30 AM(查询返回的时间戳)。

下面这条语句将会话时区设置回PST:

 

 ALTER SESSION SET TIME_ZONE = 'PST';

Session altered.
 

 

-EOF-

 

分享到:
评论

相关推荐

    oracle中日期类型与unix 时间戳的转换

    oracle中日期类型与unix 时间戳的转换, Unix时间戳记是从'1970-01-01 00:00:00'GMT开始的秒数,表现为整数型。 Oracle中的时间是Date型,以下函数提供了两种时间转换的Oracle函数 --unix时间戳与date时间互转 ...

    oracle获取当前时间,精确到毫秒并指定精确位数的实现方法

    oracle获得当前时间的,精确到毫秒 可以指定精确豪秒的位数 select to_char(systimestamp, ‘yyyymmdd hh24:mi:ss.ff ‘) from dual;–20120516 11:56:40.729083 select to_char(systimestamp, ‘yyyymmdd hh24:mi:...

    如何在Oracle 9i中正确转换时区

    在Oracle9i之前,虽然有一个NEW_TIME函数可以改变DATE的时间戳部分,但是还没有专门用来存储时区信息的数据类型。在Oracle9i中,我们可以使用DBTIMEZONE伪字段查询数据库的时区,使用 SESSIONTIMEZONE伪字段查询会话...

    Oracle PL SQL程序设计 上 第五版(代码示例)

    第10章 日期和时间戳 255 第11章 记录类型 297 第12章 集合 313 第13章 其他数据类型 381 第4部分 pl/sql中的sql 第14章 dml和事务管理 423 第15章 数据提取 444 第16章 动态sql和动态pl...

    Oracle中TIMESTAMP的几种类型介绍与实例

    我们都知道date和timestamp都是对日期和时间的表示,只是两种类型的精确度不同,前者精确到秒,后者精确到小数秒(fractional_seconds_precision),可以是 0 to 9,缺省是6。这篇文章主要介绍了Oralce中TIMESTAMP的...

    Oracle Database 11g初学者指南--详细书签版

    1.3 Oracle Database 11g的基本数据类型 8 1.3.1 varchar2 8 1.3.2 数字 9 1.3.3 日期 9 1.3.4 时间戳 9 1.3.5 clob 10 1.3.6 blob 10 1.4 表 10 1.5 存储对象 11 1.5.1 视图 12 1.5.2 触发器 12 1.5.3 ...

    北大青鸟Oracle教程集1

    北大青鸟Oracle教程集第一章 Oracle 入门 Version 3.0 目标 理解与 Oracle 相关的 RDBMS结构 结构 掌握Oracle 数据类型 掌握 掌握数据定义语言 掌握数据操纵语言 掌握事务处理和数据控制命令 Oracle 简介 对象关系...

    北大青鸟Oracle教程集2

    北大青鸟Oracle教程集第一章 Oracle 入门 Version 3.0 目标 理解与 Oracle 相关的 RDBMS结构 结构 掌握Oracle 数据类型 掌握 掌握数据定义语言 掌握数据操纵语言 掌握事务处理和数据控制命令 Oracle 简介 对象关系...

    oracle数据库11G初学者指南.Oracle.Database.11g,.A.Beginner's.Guide

    1.3 Oracle Database 11g的基本数据类型 1.3.1 varchar2 1.3.2 数字 1.3.3 日期 1.3.4 时间戳 1.3.5 clob 1.3.6 blob 1.4 表 1.5 存储对象 1.5.1 视图 1.5.2 触发器 1.5.3 过程 1.5.4 函数 1.5.5 包 1.6 Oracle ...

    Direct Oracle Access v4.1.3 bcb6

    Direct Oracle Access还含有一个Package向导,可以生成类,用以封装程序单元,并记录程序包中定义的类型。最终,将您的Oracle程序包变为Object Pascal或C++语言的自然扩展。 TOracleDataSet ——该数据集组件支持...

    oracle知识简介

    TIMESTAMP 时间戳类型。可以包含小数秒 TIMESTAMP WITH TIME ZONE 与前一种类似但是加了时区的支持 LOB数据类型存储非结构化数据,比如二进制文件,图形文件或其他外部文件。LOB可以存储到4GB。数据可以存储在...

    Oracle PL SQL程序设计 上 第五版part1

    第10章 日期和时间戳 255 第11章 记录类型 297 第12章 集合 313 第13章 其他数据类型 381 第4部分 pl/sql中的sql 第14章 dml和事务管理 423 第15章 数据提取 444 第16章 动态sql和动态pl...

    Oracle PL SQL程序设计 上 第五版part2

    第10章 日期和时间戳 255 第11章 记录类型 297 第12章 集合 313 第13章 其他数据类型 381 第4部分 pl/sql中的sql 第14章 dml和事务管理 423 第15章 数据提取 444 第16章 动态sql和动态pl...

    Oracle PL/SQL程序设计(第5版)(下册) 第一部分

    第10章 日期和时间戳 255 第11章 记录类型 297 第12章 集合 313 第13章 其他数据类型 381 第4部分 PL/SQL中的SQL 第14章 DML和事务管理 423 第15章 数据提取 444 第16章 动态SQL和动态PL/SQL 492 目 录(下册) 第5...

    Oracle PL/SQL程序设计(第5版)(下册)第二部分

    第10章 日期和时间戳 255 第11章 记录类型 297 第12章 集合 313 第13章 其他数据类型 381 第4部分 PL/SQL中的SQL 第14章 DML和事务管理 423 第15章 数据提取 444 第16章 动态SQL和动态PL/SQL 492 目 录(下册) 第5...

    适用于Java的苏打水:Java的SODA(简单Oracle文档访问)是一个Oracle库,用于编写与Oracle数据库中的JSON(不仅是JSON!)一起使用的Java应用程序。 SODA允许您的Java应用程序将Oracle数据库用作NoSQL文档存储

    每个文档都包含实际数据以及SODA自动维护的其他信息,例如唯一键,上次修改的时间戳,版本,类型等。SODA允许您在Oracle数据库中创建和存储此类文档集合,并执行在这些文档上创建,检索,更新和删除(CRUD)操作,...

    《Oracle Database编程指南》13-03:日期时间函数(Datetime Functions)

    如果您提供一个时间戳值作为参数,那么Oracle数据库将在内部将输入类型转换为日期值并返回一个日期值。例外情况是MONTHS_BETWEEN函数(它返回一个数字)和ROUND和TRUNC函数(它们根本不接受时间戳或间隔值)。

    Javascript new Date().valueOf()的作用与时间戳由来详解

    众所周知PHP中对时间类型数据可以直接转换为时间戳,那么在前端脚本js中,也有方法可以实现,就是valueOf() 例如,我们可以通过这段代码输出当前时间点的时间戳 代码如下:[removed] [removed](new Date().valueOf()...

    Oracle date如何比较大小分析

    Sql代码 代码如下: — Created on 2010/04/17 by NAN declare — Local variables here i integer; v_date1 DATE; v_date2 DATE; begin — Test statements here v_date1 := SYSDATE; v_date2 := to_date( ‘2008-09...

Global site tag (gtag.js) - Google Analytics