Oracle针对不同的数据需求,提供了多种类、多层次的数据类型体系。我们在实际应用中,最好可以依据业务数据的实际形态和前端应用的语言、框架特性来确定字段类型的选择。

Date类型是我们经常使用的时间类型数据表示,包括了年月日时分秒信息。作为Date类型的一个拓展,Oracle提供了Timestamp数据类型,作为高精度时间类型的体现。

 

1、Timestamp的高精度

Timestamp在官方中的定义方式是timestamp(n),其中n表示秒级片段(fractional_seconds)的精确度。作为Date类型的一个拓展,Timestamp提供了更为精确的时间定位。

SQL> select systimestamp from dual;

SYSTIMESTAMP

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

13-7月 -11 07.52.16.562000 下午 +08:00

SQL> select sysdate from dual;

SYSDATE

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

2011-7-13 20:13:55

使用systimestamp函数,我们可以获取到当前时间的timestamp with local time zone取值。默认情况下,我们发现和sysdate显示的有一些差异。控制和显示timestamp格式的参数,可以通过v$nls_parameters进行查看。

SQL> select * from v$nls_parameters;

PARAMETER                      VALUE

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

(篇幅原因,有省略…)

NLS_SORT                       BINARY

NLS_TIME_FORMAT                HH.MI.SSXFF AM

NLS_TIMESTAMP_FORMAT           DD-MON-RR HH.MI.SSXFF AM

NLS_TIME_TZ_FORMAT             HH.MI.SSXFF AM TZR

NLS_TIMESTAMP_TZ_FORMAT        DD-MON-RR HH.MI.SSXFF AM TZR

19 rows selected

参数nls_timestamp_format和nls_timestamp_tz_format分别来控制timestamp和timestamp with local zone的显示格式。

上面systimestamp显示的信息,可以解析为:2011-7-13 19:52:16。稍稍费解的是秒后面的562000数字。这个是Timestamp的秒片段(fractional seconds),就是秒向下的精度划分。timestamp定义中的n就是指定的每秒划分的精度范围。

实际应用中,n取值为0-9,默认为6。从上面例子上的systimestamp函数返回值上看,也是的确如此。

SQL> create table t (d1 timestamp, d2 timestamp(0), d3 timestamp(9));

Table created

SQL> desc t;

Name Type         Nullable Default Comments

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

D1   TIMESTAMP(6) Y

D2   TIMESTAMP(0) Y

D3   TIMESTAMP(9) Y

那么,timestamp类型的高精度有什么作用呢?个人认为大部分还是为了前端并发访问时候的锁机制,还有一些特殊行业的高精度需求。很多开发框架都需要使用一个高精度的数据列来标记行访问的时间顺序,通过timestamp的精度,基本可以满足这部分的需要。

 

2、Timestamp with time zone

Timestamp类型的另一个特性就是时区timezone特性。我们知道世界各地所处的时区不同,对应同一个时刻显示的时间是不同的。所以如果精确定义一个时间点,特别是对应一个全球性系统的时候,时区Timezone是不可或缺的考虑因素。

Date类型只能适应于一般时间的表示,如果加入了时区因素,就无能为力了。在这样的情况下,就可以选择Timestamp类型的一个拓展类型,timestamp with time zone。这样就可以把当前对应的时区信息加入到数据列中。

函数systimestamp返回标准类型就是timestamp with time zone。与一般timestamp类型不同的是,timestamp with time zone额外加入了当前时区的信息。

SQL> select systimestamp from dual;

SYSTIMESTAMP

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

13-7月 -11 07.52.16.562000 下午 +08:00

+08:00表示时区,全球有12个时区。系统的时区通过参数设置或者当前操作系统OS的配置来获取。

SQL> create table t (d1 date, d2 timestamp, d3 timestamp with time zone);

Table created

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

1 row inserted

SQL> commit;

Commit complete

SQL> select * from t;

D1                   D2                                       D3

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

2011-7-13 21:12:32   13-7月 -11 09.12.32.859000 下午          13-7月 -11 09.12.32.859000 下午 +08:00

加入时区信息之后,可以做到全球时间下的绝对时间比较。

此外,timestamp还有一个timestamp with local time zone的拓展类型。也包括时区信息,与time zone的差别有下面几个:

ü        不管是什么时区的日期插入到数据库中,都会进行正规化工作。将其他时区的日期转化为数据库对应的时区(Database Time Zone)中;

ü        当进行检索操作的时候,local time zone类型数据又会被转化为当前检索会话对应的time zone中。这一系列的转化操作对end user而言都是透明的;

在对应会话和数据库的时区上,与系统参数NLS_TERRITORY是相关的。Oracle往往通过这个参数的国家设置来判断时区。而客户端的参数往往与nls_lang相关。

3、Timestamp显示格式控制

最后我们一起来看看timestamp显示的格式方式。默认情况下,timestamp以及timestamp with time zone的显示是与系统参数nls_timestamp_format和nls_timestamp_tz_format有关。在我们的实验环境下,两个格式字符串(format string)分别为:

NLS_TIMESTAMP_FORMAT           DD-MON-RR HH.MI.SSXFF AM

NLS_TIMESTAMP_TZ_FORMAT        DD-MON-RR HH.MI.SSXFF AM TZR

其中,DD、MON、HH和MI都是我们非常熟悉的日期格式字符串。RR表示使用年的后两位进行表示。而SSXFF是一个组合条件,应该被拆分为SS、X和FF三个部分。SS表示秒信息,X表示基数开关,而FF表示小于一秒的时间片段。

X表示的基数开关是什么意思呢?我们通过实验就可以看出情况。

SQL> select to_char(systimestamp,'DD-MON-RR HH.MI.SSXFF AM') SSXFF, to_char(systimestamp,'DD-MON-RR HH.MI.SSFF AM') SSFF from dual;

SSXFF                                  SSFF

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

13-7月 -11 09.37.16.843000 下午        13-7月 -11 09.37.16843000 下午

加入了X表示开关之后,就在秒为加入了一个.号表示分割。便于查看。

而AM表示是否使用(AM和PM)显示上下午信息,TZR则表示是否显示出时区信息。

当显示timestamp类型的时候,如果没有明确指定显示格式,系统会自动使用nls_timestamp_format系列参数。

SQL> select to_char(systimestamp, 'yyyy-mm-dd hh24:mi:ss ff tzr') from dual;

TO_CHAR(SYSTIMESTAMP,'YYYY-MM-

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

2011-07-13 21:40:50 265000 +08:00

如果期望在会话(或者系统)一级修改参数,就要使用alter session或者alter system方法。

SQL> select to_char(systimestamp) from dual;

TO_CHAR(SYSTIMESTAMP)

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

13-7月 -11 09.42.44.343000 下午 +08:00

//对当前会话修改参数;

SQL> alter session set nls_timestamp_tz_format='yyyy-mm-dd hh24:mi:ss ff tzr';

Session altered

SQL> select to_char(systimestamp) from dual;

TO_CHAR(SYSTIMESTAMP)

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

2011-07-13 21:43:18 984000 +08:00

4、结论

timestamp系列类型是对Oracle Date类型的一种有益补充。在需要的场合下,可以适当使用。

转载:http://blog.itpub.net/17203031/viewspace-702132

Timestamp类型浅析的更多相关文章

  1. mysql关于timestamp类型

    数据库设置时间字段为timestamp类型,DTO设置为java.util.Date类型.DTO设值sessionLogDTO.setLoginOutTime(new Date());用new Dat ...

  2. MySQL中DATETIME、DATE和TIMESTAMP类型的区别

    一.TIMESTAMP 显示格式:YYYY-MM-DD HH:MM:SS 时间范围:[ '1970-01-01 00:00:00'到'2037-12-31 23:59:59'] TIMESTAMP D ...

  3. java获取获得Timestamp类型的当前系统时间。以及java.util.date 、java.sql.Date之间的转换

    java获取取得Timestamp类型的当前系统时间java获取取得Timestamp类型的当前系统时间 格式:2010-11-04 16:19:42 方法1: Timestamp d = new T ...

  4. java 反射: 当Timestamp类型的属性值为null时,设置默认值

    import java.beans.PropertyDescriptor; import java.lang.reflect.Field; import java.lang.reflect.Metho ...

  5. java获取获得Timestamp类型的当前系统时间

    java获取取得Timestamp类型的当前系统时间java获取取得Timestamp类型的当前系统时间 格式:2010-11-04 16:19:42 方法1: Timestamp d = new T ...

  6. java获取获得Timestamp类型的当前系统时间。

    java获取获得Timestamp类型的当前系统时间.   java获取取得Timestamp类型的当前系统时间 格式:2010-11-04 16:19:42 方法1: Timestamp d = n ...

  7. 在hive中直接对timestamp类型取max报错

    之前直接对timestamp类型做max操作, select id,max(updatetime) updatetime from his.tag group by id; 结果查询的结果有的显示为1 ...

  8. EntityFrameworkCore将数据库Timestamp类型在程序中转为long类型

    EntityFrameworkCore将数据库Timestamp类型在程序中转为long类型 EntityFrameworkCore Entity public class Entity { publ ...

  9. TIMESTAMP类型字段在SQL Server和MySQL中的含义和使用

    公众号上转的满天飞的一篇文章,MySQL优化相关的,无意中瞄到一句“尽量使用TIMESTAMP而非DATETIME”,之前对TIMESTAMP也不太熟悉,很少使用,于是查了一下两者的区别. 其实,不管 ...

随机推荐

  1. MySQL之联合索引

    以 index(a, b, c) 为例: 语句 发挥作用的索引 记忆方法(以三块板子过河记忆, 顺序很重要) WHERE a=3 只用到了a列 只走了a板子 WHERE a=3 AND b=5 使用了 ...

  2. (转) MapReduce Design Patterns(chapter 5 (part 1))(九)

    Chapter 5. Join Patterns 把数据保存成一个巨大的数据集不是很常见.例如,用户信息数据频繁更新,所以要保存到关系数据库中.于此同时,web日志以恒定的数据流量增加,直接写到HDF ...

  3. IOS开发 GCD介绍: 基本概念和Dispatch Queue

    iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题 ØN ...

  4. hiredis处理zscan和hscan的reply

    zscan的返回值可以看做是一个二维数组,第一维包含两个元素:string类型的游标cursor和集合元素数组:第二维即集合元素数组,这个数组交替存放着集合元素和score,元素和score也都是st ...

  5. Javascrpt 速成篇】 三:js事件处理

    ie和chrome,firefox的事件处理,除了函数名字不同,基本大同小异.这样就已chrome为主了,对ie有兴趣的自己去百度.jquery已经处理不同浏览器兼容性问题,推荐使用. 事件处理有两种 ...

  6. c++学习笔记(5)

    1.两个相邻的仅由空格,制表符或者换行符分开的字符串字面值,可连接成一个新的字符串 cout<<"a multi-line " "string literal ...

  7. C++面向对象的编程思想机器人

    C++的面向对象的编程思想如下,一般情况为一个类中包含了这个对象的所有属性与函数,直接调用这个对象就可以对这个对象执行它可以使用的任何操作. #include <iostream> cla ...

  8. Jmeter-ForEach控制器

    ForEach Controller需要配合‘用户定义的变量’来使用,作用是参数化 名称:字面意思,ForEach Controller的名称 注释:字面意思 输入变量前缀:变量的前缀:如要使用的变量 ...

  9. 每天一个linux命令:【转载】cat命令

    cat命令的用途是连接文件或标准输入并打印.这个命令常用来显示文件内容,或者将几个文件连接起来显示,或者从标准输入读取内容并显示,它常与重定向符号配合使用. 1.命令格式: cat [选项] [文件] ...

  10. 阿里云ECS 环境是CentOS 7.3安装mongodb3

    CentOS安装mongodb https://www.cnblogs.com/zddzz/p/10069912.html CentOS安装mongodb 我的是阿里云ECS 环境是CentOS 7. ...