`

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 with Time zone & java

    在设置Oracle的Timestamp with Time Zone类型的值时,可以使用`setObject()`方法,传入`ZonedDateTime`对象。在从数据库查询结果获取Timestamp with Time Zone数据时,可以通过`ResultSet.getObject()`方法,然后...

    oracle --timestamp

    在Oracle数据库中,`TIMESTAMP`是一种用于存储日期和时间的数据类型,它可以精确到毫秒级别。`TIMESTAMP`数据类型不仅包含了日期和时间,还包含了时区信息,这对于处理全球性的业务非常重要。 #### 2. 创建表并插入...

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

    在Oracle数据库中,`TIMESTAMP` 是一种用于存储日期和时间数据类型的字段,与传统的`DATE`类型相比,它的精度更高,能够精确到小数秒。`TIMESTAMP` 类型的精度可设置为 0 到 9 位,缺省情况下是 6 位,这意味着它...

    ORACLE 自动类型转换

    Oracle数据库支持多种数据类型,如数值型(NUMBER、INTEGER、BINARY_INTEGER等)、字符型(VARCHAR2、CHAR、CLOB等)、日期时间型(DATE、TIMESTAMP等)以及二进制数据类型(RAW、BLOB等)。在某些情况下,当不同...

    Oracle与.Net 数据类型映射

    3. **日期/时间类型**:DateTime对应Oracle的DATE,DateTimeOffset对应TIMESTAMP WITH TIME ZONE,TimeSpan对应INTERVAL DAY TO SECOND。 4. **二进制数据类型**:byte[]对应BLOB,System.IO.FileStream或其他流...

    Oracle与DB2数据类型的分类对应说明

    同时,DB2 的 TIME 类型包含时、分、秒,可以与 Oracle 的 TIMESTAMP 类型对应。 在数据类型转换时,需要注意以下几点: * 如果只使用 MM/DD/YYYY格式,则使用 DATE 类型。 * 如果只使用 HH:MM:SS 格式,则使用 ...

    oracle中TIMESTAMP与DATE比较.docx

    在本文中,我们讨论了 Oracle 数据库中 TIMESTAMP 和 DATE 两个数据类型的特点、使用场景和优缺点。TIMESTAMP 数据类型比 DATE 数据类型更适合用于需要精确计算时间间隔的情况。同时,我们也提供了一些实际应用中的...

    oracle新手入门指导之四——ORACLE数据类型 .txt

    ### Oracle新手入门指导之四——ORACLE数据类型 在Oracle数据库中,数据类型的选择对于确保数据的正确存储、处理效率以及资源的有效利用至关重要。本文将详细介绍Oracle中的各种数据类型及其特性,帮助初学者更好地...

    oracle-java数据类型1

    - `TIMESTAMP`, `TIMESTAMP WITH TIME ZONE`, `TIMESTAMP WITH LOCAL TIME ZONE` 类型对应 Oracle 的时间戳类型,没有标准的 JDBC 类型,但可以通过 `oracle.jdbc.OracleTypes.TIMESTAMP` 等访问 3. **用户定义的...

    Oracle date 和 timestamp 区别详解

    当在不同表之间移动数据,如果目标字段是TIMESTAMP类型,Oracle会在INSERT SELECT语句中自动处理DATE到TIMESTAMP的转换。 总结来说,DATE类型适用于大部分日常日期时间需求,而TIMESTAMP则在需要更高精度的情况下...

    oracle字段类型转换的处理

    Oracle数据库支持多种数据类型,包括数值类型(如NUMBER、INTEGER、BINARY_FLOAT等)、字符类型(如VARCHAR2、CHAR、CLOB等)、日期时间类型(如DATE、TIMESTAMP等)以及二进制类型(如RAW、BLOB等)。在实际应用中...

    java、mysql以及oracle数据类型对照表

    此外,Java的浮点数类型(float和double)对应MySQL的FLOAT和DOUBLE,而在Oracle中,可以使用BINARY_FLOAT和BINARY_DOUBLE。 Oracle数据库提供了更多的复杂数据类型,如OBJECT、ARRAY、REF,这些在Java中可以通过...

    Oracle 10g 操作手册 Oracle数据类型精解

    本操作手册旨在深入解析Oracle 10g的使用,特别是其数据类型的详细信息,同时通过PowerDesigner的实例教程,帮助初学者快速入门并积累实践经验。 一、Oracle数据类型详解 在Oracle数据库中,数据类型定义了列可以...

    mssql2oracle类型对比

    - `timestamp`: 存储时间戳信息,等同于Oracle中的`RAW`类型。 - **Oracle**: - `ROWID`: 用于唯一标识行的位置,SQL Server中没有直接对应的类型,可以考虑使用`identity`列类型。 - `CURRVAL`和`NEXTVAL`: ...

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

    Oracle 数据类型的使用和研究是早于计算机技术的出现的,使用不同的数据类型是为了保存和处理现实生活中不同性质信息的需要。例如统计人数可以用整型数据、计算有整有零的工资和利息使用浮点数、而要记录人的姓名就...

    oracle数据类型和对应的JDBC类型.pdf

    Oracle 扩展的 JDBC 类型包括:BFILE、ROWID、CURSOR、TIMESTAMP、TIMESTAMPLTZ 等。这些类型可以用于 Oracle 数据库中的特殊操作。 在 Java 应用程序中,了解 Oracle 数据类型和对应的 JDBC 类型是非常重要的,...

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

    时间间隔可以是正数或负数,并且可以直接与TIMESTAMP类型的数据进行加减运算,以计算新的时间点。例如,在实验管理的场景中,可以创建一个表格记录实验的开始时间(experiment_start)和持续时间(experiment_...

Global site tag (gtag.js) - Google Analytics