`

oracle的timestamp类型使用

阅读更多

我们都知道date和timestamp都是对日期和时间的表示,只是两种类型的精确度不同,前者精确到秒,后者精确到小数秒(fractional_seconds_precision),可以是 0 to 9,缺省是6。

但是对date类型的运算很简单,有很多函数可用来处理;而两个timestamp的差则是很直观地显示为多少天+多少小时+多少分钟+多少秒+多少小数秒,

 

SQL> create table test (T1 TIMESTAMP(6),
2 T2 TIMESTAMP(6));

表已创建。

SQL> insert into test values(
2 to_timestamp('2006-01-01 12:10:10.1','yyyy-mm-dd hh24:mi:ss.ff'),
3 to_timestamp('2006-01-01 12:20:10.2','yyyy-mm-dd hh24:mi:ss.ff'));

已创建 1 行。

SQL>
SQL> insert into test values(
2 to_timestamp('2006-01-01 12:10:10.1','yyyy-mm-dd hh24:mi:ss.ff'),
3 to_timestamp('2006-01-02 12:20:10.2','yyyy-mm-dd hh24:mi:ss.ff'));

已创建 1 行。

SQL>
SQL> insert into test values(
2 to_timestamp('2006-01-01 12:10:10.1','yyyy-mm-dd hh24:mi:ss.ff'),
3 to_timestamp('2006-01-02 13:40:20.2','yyyy-mm-dd hh24:mi:ss.ff'));

已创建 1 行。

SQL> commit;

提交完成。

SQL>

两个timestamp的差则是很直观地显示为多少天+多少小时+多少分钟+多少秒+多少小数秒:
SQL> select t2-t1 from test;
+000000000 00:10:00.100000
+000000001 00:10:00.100000
+000000001 01:30:10.100000

SQL>

但要简单地转化为某一个精度却比较麻烦,用类似date类型的处理方法是不行的。如转化为分:
SQL> select 1440*(t2-t1) from test;
+000000010 00:02:24.000000000
+000001450 00:02:24.000000000
+000001530 04:02:24.000000000

SQL>

发现结果根本不是原先想要的,而是在原先的“多少天+多少小时+多少分钟+多少秒+多少小数秒”的每一项都乘以1440再进行进制处理。

最容易理解的就是用substr将两个timestamp的差进行分割转化处理:

SQL>  SELECT substr((t2-t1),instr((t2-t1),' ')+7,2)         seconds,
2      substr((t2-t1),instr((t2-t1),' ')+4,2)         minutes,
3     substr((t2-t1),instr((t2-t1),' ')+1,2)         hours,
4     trunc(to_number(substr((t2-t1),1,instr(t2-t1,' '))))  days,
5     trunc(to_number(substr((t2-t1),1,instr(t2-t1,' ')))/7) weeks
6 FROM test;

SECO MINU HOUR DAYS WEEKS
---- ---- ---- ---------- ----------
00 10 00 0 0
00 10 00 1 0
10 30 01 1 0

 

或者利用自定义函数来实现将天数转换成“天时分秒”格式:

CREATE OR REPLACE FUNCTION F_DAYS2STR(P_DAYS IN NUMBER DEFAULT 0)
RETURN VARCHAR2 IS
--Ver:1.0
--Created by xsb on 2005-05-26
--For: 将天数转换成天时分秒格式
DAYS NUMBER := NVL(P_DAYS,
0);
VD NUMBER;
--
VH NUMBER;
--小时
VM NUMBER;
--
VS NUMBER;
--
RESULT VARCHAR2(
100); --返回值
BEGIN
VD := TRUNC(DAYS);
VH := TRUNC((DAYS - VD) *
24);
VM := TRUNC((DAYS - VD - VH /
24) * 24 * 60);
VS := TRUNC((DAYS - VD - VH /
24 - VM / 24 / 60) * 24 * 60 * 60);
SELECT DECODE(VD,
0, '', VD || '') || DECODE(VH, 0, '', VH || '小时') ||DECODE(VM, 0, '', VM || '') || DECODE(VS, 0, '', VS || '') INTO RESULT FROM DUAL;
RETURN(RESULT);
END;

 

SQL>

如果最后结果的精度要求不高时(在分或分以上时),就可以先将timestamp转化为date再结算,这样就简单多了:

SQL> select (to_date(to_char(t2,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss'
)-to_date(to_char(t1,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss'))*24*60
2 from test;

10

1450

1530.16667

 

date转换为timestamp:

SELECT CAST(sysdate AS TIMESTAMP) from dual;

 

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秒。
  1 SELECT time1,
   2 time2,
   3 substr((time2-time1),instr((time2-time1),' ')+7,2) seconds,
   4 substr((time2-time1),instr((time2-time1),' ')+4,2) minutes,
   5 substr((time2-time1),instr((time2-time1),' ')+1,2) hours,
   6 trunc(to_number(substr((time2-time1),1,instr(time2-time1,' ')))) days,
   7 trunc(to_number(substr((time2-time1),1,instr(time2-time1,' ')))/7) weeks
   8* 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的时候,需要注意,它们既有类似的地方,更有不同的地方,而足以造成破坏。两者在简洁和间隔尺寸方面各有优势,请合理地选择。

分享到:
评论
3 楼 怼怼怼怼 2017-08-11  
   
2 楼 怼怼怼怼 2017-08-11  
    
1 楼 怼怼怼怼 2017-08-11  
                   

相关推荐

    oracle中TIMESTAMP与DATE比较

    oracle中TIMESTAMP与DATE比较

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

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

    Oracle date 和 timestamp 区别详解

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

    关于Hinbernate中TimeStamp类型字段处理的小例子

    NULL 博文链接:https://zhengkaifl.iteye.com/blog/734139

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

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

    Oracle 数据类型

    5、DATE数据类型,使用7个字节固定长度,每个字节分别存储世纪,年,月,日 ,时,分,秒,ORACLE中SYSDATE函数的功能是返回当前的日期和时间 6、TIMESTAMP数据类型,和DATE相似,但是这个类型的秒精确到小数点后6...

    使用Oracle中的时间间隔型数据

    在Oracle 9i中,按照SQL 99标准,增加了时间间隔型数据INTERVAL YEAR TO MONTH 和 INTERVAL DAY TO SECOND,它们和其他几种数据类型一起使得对时间的处理更加准确。TIMESTAMP、TIMESTAMP WITH TIME ZONE和TIMESTAMP ...

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

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

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

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

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

    Oracle不仅可以通过基本的sql进行简单的数据操作,还可使用对标准sql进行了扩展的PL/SQL语言,可使用如IF…THEN…、WHILE、LOOP等同结构化程序语言一样的构造制作程序,还有制作函数、过程、触发器等也用PL/SQL语言...

    毫秒与时间互相转换-精确到毫秒

    功能:将1970-01-01 00:00:00以来的毫秒数转换为对应的timestamp时间类型,精确保留毫秒级精度! 参数:I_MILLISECONDS NUMBER 待转换的毫秒数 示例:select MILLISECONDS2TIMESTAMP(1397457489296) from dual; ...

    通过创建SQLServer 2005到 Oracle10g 的链接服务器实现异构数据库数据转换方案

    在“安全性”项中,选中使用此安全上下文建立连接,填写远程登录用户和密码,即登录远程Oracle服务器的用户和密码。如图4所示。3、异构数据库访问语句格式 比如我们建立了链接服务器ORADBCONN,而Oracle中在HRSOFT...

    Oracle jdbc for 11g 最新版 驱动 ojdbc6dms.jar

     1、支持JDK6,支持JDBC 4.0,新的java.sql.SQLXML类型没有被支持,是使用ojdbc6.jar来支持。J2SE 5.0 和 JDBC 3.0 全面支持使用ojdbc5.jar。  2.不再支持oracle.jdbc.driver。从9.0.1开始的每个release都推荐...

    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教程集1

    Number(p, s) Oracle 主要数据类型 4-3 Date 数据类型 ―Date ―Timestamp ―Interval day to second ―Interval year to month ―Timestamp with time zone ―Timestamp with local time zone Oracle 主要数据类型 ...

    北大青鸟Oracle教程集2

    Number(p, s) Oracle 主要数据类型 4-3 Date 数据类型 ―Date ―Timestamp ―Interval day to second ―Interval year to month ―Timestamp with time zone ―Timestamp with local time zone Oracle 主要数据类型 ...

    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 9i&10g编程艺术:深入数据库体系结构(全本)含脚本

    12.6.3 TIMESTAMP类型 533 12.6.4 INTERVAL类型 541 12.7 LOB 类型 544 12.7.1 内部LOB 545 12.7.2 BFILE 557 12.8 ROWID/UROWID类型 559 12.9 小结 560 第13章 分区 561 13.1 分区概述 561 13.1.1 提高...

Global site tag (gtag.js) - Google Analytics