`

ORACLE DATE和TIMESTAMP数据类型的比较

阅读更多
DATE数据类型

  这个数据类型我们实在是太熟悉了,当我们需要表示日期和时间的话都会想到date类型。它可以存储月,年,日,世纪,时,分和秒。它典型地用来表示什 么时候事情已经发生或将要发生。DATE数据类型的问题在于它表示两个事件发生时间间隔的度量粒度是秒。这个问题将在文章稍后讨论timestamp的时 候被解决。可以使用TO_CHAR函数把DATE数据进行传统地包装,达到表示成多种格式的目的。

  SQL> SELECT TO_CHAR(date1,'MM/DD/YYYY HH24:MI:SS') "Date" FROM date_table;

  Date

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

  06/20/2003 16:55:14

  06/26/2003 11:16:36

  我见到的大多数人陷入的麻烦就是计算两个时间间的间隔年数、月数、天数、小时数和秒数。你需要明白的是,当你进行两个日期的相减运算的时候,得到的是 天数。你需要乘上每天的秒数(1天=86400秒),然后,你可以再次计算得到你想要的间隔数。下面就是我的解决方法,可以精确计算出两个时间的间隔。我 明白这个例子可以更简短些,但是我是为了显示所有的数字来强调计算方式。

     SELECT TO_CHAR(date1,'MMDDYYYY:HH24:MI:SS') date1,
     TO_CHAR(date2,'MMDDYYYY:HH24:MI:SS') date2,
     trunc(86400*(date2-date1))-
     60*(trunc((86400*(date2-date1))/60)) seconds,
     trunc((86400*(date2-date1))/60)-
     60*(trunc(((86400*(date2-date1))/60)/60)) minutes,
     trunc(((86400*(date2-date1))/60)/60)-
     24*(trunc((((86400*(date2-date1))/60)/60)/24)) hours,
     trunc((((86400*(date2-date1))/60)/60)/24) days,
    trunc(((((86400*(date2-date1))/60)/60)/24)/7) weeks
    FROM date_table

  DATE1       DATE2        SECONDS  MINUTES   HOURS   DAYS   WEEKS
  ----------------- ----------------- ---------- ---------- ---------- ---------- ----------
  06202003:16:55:14 07082003:11:22:57     43     27     18    17     2
  06262003:11:16:36 07082003:11:22:57     21     6     0    12     1

  TIMESTAMP 数据类型

  DATE数据类型的主要问题是它粒度不能足够区别出两个事件哪个先发生。ORACLE已经在DATE数据类型上扩展出来了TIMESTAMP数据类 型,它包括了所有DATE数据类型的年月日时分秒的信息,而且包括了小数秒的信息。如果你想把DATE类型转换成TIMESTAMP类型,就使用CAST 函数。

  SQL> SELECT CAST(date1 AS TIMESTAMP) "Date" FROM t;

  Date
  -----------------------------------------------------
  20-JUN-03 04.55.14.000000 PM
  26-JUN-03 11.16.36.000000 AM

  正如你看到的,在转换后的时间段尾部有了一段“.000000”。这是因为从date转换过来的时候,没有小数秒的信息,缺省为0。而且显示格式是按 照参数NLS_TIMESTAMP_FORMAT定的缺省格式显示。当你把一个表中date类型字段的数据移到另一个表的timestamp类型字段中去 的时候,可以直接写INSERT SELECT语句,oracle会自动为你做转换的。

  1 SELECT TO_CHAR(time1,'MM/DD/YYYY HH24:MI:SS') "Date" FROM date_table

  Date
  -------------------
  06/20/2003 16:55:14
  06/26/2003 11:16:36

TIMESTAMP数据的格式化显示和DATE 数据一样。注意,to_char函数支持date和timestamp,但是trunc却不支持TIMESTAMP数据类型。这已经清楚表明了在当两个时 间的差别极度重要的情况下,使用TIMESTAMP数据类型要比DATE数据类型更确切。

  如果你想显示TIMESTAMP的小数秒信息,参考下面:

  1 SELECT TO_CHAR(time1,'MM/DD/YYYY HH24:MI:SS:FF3') "Date" FROM date_table

  Date
  -----------------------
  06/20/2003 16:55:14:000
  06/26/2003 11:16:36:000

  在上例中,我只现实了小数点后3位的内容。

  计算timestamp间的数据差别要比老的date数据类型更容易。当你直接相减的话,看看会发生什么。结果将更容易理解,第一行的17天,18小时,27分钟和43秒。

 SELECT time1,
     time2,
     substr((time2-time1),instr((time2-time1),' ')+7,2)         seconds,
     substr((time2-time1),instr((time2-time1),' ')+4,2)         minutes,
     substr((time2-time1),instr((time2-time1),' ')+1,2)         hours,
     trunc(to_number(substr((time2-time1),1,instr(time2-time1,' '))))  days,
     trunc(to_number(substr((time2-time1),1,instr(time2-time1,' ')))/7) weeks
  FROM date_table

  TIME1            TIME2           SECONDS MINUTES HOURS DAYS WEEKS
  -------------------------  -------------------------- ------- ------- ----- ---- -----
  06/20/2003:16:55:14:000000 07/08/2003:11:22:57:000000 43   27   18  17  2
  06/26/2003:11:16:36:000000 07/08/2003:11:22:57:000000 21   06   00  12  1

  这就意味着不再需要关心一天有多少秒在麻烦的计算中。因此,得到天数、月数、天数、时数、分钟数和秒数就成为用substr函数摘取出数字的事情了。

  系统日期和时间

  为了得到系统时间,返回成date数据类型。你可以使用sysdate函数。

  SQL> SELECT SYSDATE FROM DUAL;

  为了得到系统时间,返回成timestamp数据类型。你可以使用systimpstamp函数。

  SQL> SELECT SYSTIMESTAMP FROM DUAL;

  你可以设置初始化参数FIXED_DATE指定sysdate函数返回一个固定值。这用在测试日期和时间敏感的代码。注意,这个参数对于systimestamp函数无效。

  SQL> ALTER SYSTEM SET fixed_date = '2003-01-01-10:00:00';

  System altered.

  SQL> select sysdate from dual;

  SYSDATE
  ---------
  01-JAN-03

  SQL> select systimestamp from dual;

  SYSTIMESTAMP
  ---------------------------------------------------------
  09-JUL-03 11.05.02.519000 AM -06:00

  当使用date和timestamp类型的时候,选择是很清楚的。你可以随意处置date和timestamp类型。当你试图转换到更强大的 timestamp的时候,需要注意,它们既有类似的地方,更有不同的地方,而足以造成破坏。两者在简洁和间隔尺寸方面各有优势,请合理地选择。
分享到:
评论

相关推荐

    Oracle date 和 timestamp 区别详解

    Oracle date 和 timestamp 区别详解 1.DATE数据类型  这个数据类型我们实在是太熟悉了,当我们需要表示日期和时间的话都会想到date类型。它可以存储月,年,日,世纪,时,分和秒。它典型地用来表示什么时候事情...

    oracle日期时间数据类型与时间间隔数据类型讲解

    对oracle date,timestamp,interval数据类型的详细讲解。

    Oracle 数据类型

    6、TIMESTAMP数据类型,和DATE相似,但是这个类型的秒精确到小数点后6位,而DATE没有秒的小数部分 7、LOB数据类型用于存储大型的,没有被结构化的数据,例如二进制文件,图片文件,LOB主要分为BLOB和CLOB,BLOB...

    Oracle实用教程_04章_Oracle数据类型和函数[整理].pdf

    Oracle 数据类型和函数 Oracle 数据类型是指一组性质相同的值的集合以及定义于这个值集合上的一组操作的总称。在 Oracle 数据库中,数据类型可以分为字符型、数值型、日期型和其它类型等几类。 Oracle 数据类型...

    Oracle官方技术支持Les09创建和管理表.pptx

    创建表需要使用 CREATE TABLE 语句,该语句需要具备 CREATE TABLE 权限和存储空间,并且需要指定表名、列名、数据类型和尺寸。例如: CREATE TABLE dept( deptno NUMBER(2), dname VARCHAR2(14), loc VARCHAR2...

    oracle连接代码(包含修改timestamp报错修改)

    1主要针对连接oracle数据库代码 2解决[Err] ORA-01830: date format picture ends before converting entire input string报错问题代码,主要是将timestamp数据类型进行格式化成正常数据

    Oracle和MySQL语句区别.doc

    例如,Oracle支持的数据类型有CHAR、VARCHAR2、NUMBER、DATE、TIMESTAMP等,而MySQL则支持的数据类型有CHAR、VARCHAR、INT、DATE、TIMESTAMP等。此外,Oracle的NUMBER类型可以表示数字、整数和浮点数,而MySQL的INT...

    Java数据类型与各数据库类型映射一览表

    Java数据类型与各数据库类型映射...本资源对于了解 Java 数据类型和数据库类型之间的映射关系非常有用,特别是在开发涉及到数据库交互的应用程序时。同时,本资源也可以作为数据库管理系统和 Java 开发相关的参考文献。

    Oracle数据库SQL基本应用与介绍

    Oracle的数据类型: 文字列型:CHAR、nchar、varchar2、nvarchar2、long 数值型:number、integer、float、int等。 日期型、期间型:date、timestamp、timestamp with time zone等。 Oracle数据库对象:cluster、...

    oracle常用数据类型说明

    类型 含义 存储描述 备注 CHAR 固定长度字符串 最大长度2000bytes   VARCHAR2 可变长度的字符串, 最大长度4000bytes 可做索引的最大长度749 NCHAR ...DATE ...TIMESTAMP ...与DATE相比较,TIMESTAMP有小

    北大青鸟Oracle教程集1

    Oracle主要 Oracle主要 数据类型 4-1 Character 数据类型 Number 数据类型 Date 数据类型 Raw 和 Long Raw 数据类型 LOB 数据类型 Oracle 主要数据类型 4-2 Character 数据类型 ― Char ― Varchar2 ― Long Number ...

    北大青鸟Oracle教程集2

    Oracle主要 Oracle主要 数据类型 4-1 Character 数据类型 Number 数据类型 Date 数据类型 Raw 和 Long Raw 数据类型 LOB 数据类型 Oracle 主要数据类型 4-2 Character 数据类型 ― Char ― Varchar2 ― Long Number ...

    Oracle to_char

    Oracle 的 to_char 函数是一个功能强大且灵活的格式化函数,能够将各种数据类型(日期/时间、整数、浮点数、数字)转换成格式化的字符串,并且能够从格式化的字符串转换回原始的数据类型。该函数的第二个参数是用于...

    Oracle数据库语句大全.doc

    Oracle 数据库支持多种数据类型,包括字符型、数值型、日期型等。 字符型包括: * CHAR:1-2000 字节的定长字符 * VARCHAR2:1-4000 字节的变长字符 * LONG:2GB 的变长字符 数值型包括: * NUMBER:最高精度 38...

    第四章 ORACLE表管理.pptx

    ORACLE 基本数据类型包括 NUMBER、VARCHAR2、CHAR、DATE、TIMESTAMP 等。 * NUMBER:精度更高的实数类型,精度 38 位。 * VARCHAR2:可变长度的字符串,以字符为单位,最大长度 4000 chars。 * CHAR:固定长度字符...

    Oracle数据库恢复工具Oracle Database Unloader(ODU)3.09

    支持的数据类型包括:NUMBER, CHAR, VARCHAR2, NCHAR,NVARHCAR2, LONG, DATE, RAW, LONG RAW, BLOB, CLOB, TIMESTAMP (9i+) , BINARY FLOAT, BINARY DOUBLE (10g+) 导出的数据格式包括纯文本和DMP文件两种。以纯...

    oracle数据库修复

    支持的数据类型包括:NUMBER, CHAR, VARCHAR2, NCHAR,NVARHCAR2, LONG, DATE, RAW, LONG RAW, BLOB, CLOB, TIMESTAMP (9i+) , BINARY FLOAT, BINARY DOUBLE (10g+) 全面支持LOB字段: 支持CLOB、NCLOB和BLOB CLOB...

    Oracle_Database_11g完全参考手册.part3/3

    10.7 使用TIMESTAMP数据类型 第11章 转换函数与变换函数 11.1 基本的转换函数 11.1.1 数据类型的自动转换 11.1.2 关于自动转换的注意事项 11.2 特殊的转换函数 11.3 变换函数 11.3.1 TRANSLATE 11.3.2 DECODE 11.4 ...

    Oracle_Database_11g完全参考手册.part2/3

    10.7 使用TIMESTAMP数据类型 第11章 转换函数与变换函数 11.1 基本的转换函数 11.1.1 数据类型的自动转换 11.1.2 关于自动转换的注意事项 11.2 特殊的转换函数 11.3 变换函数 11.3.1 TRANSLATE 11.3.2 DECODE 11.4 ...

    oracle知识简介

    DATE 用于存储日期和时间格式的数据,DD-MON-YY TIMESTAMP 时间戳类型。可以包含小数秒 TIMESTAMP WITH TIME ZONE 与前一种类似但是加了时区的支持 LOB数据类型存储非结构化数据,比如二进制文件,图形文件或其他...

Global site tag (gtag.js) - Google Analytics