`

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的时候,需要注意,它们既有类似的地方,更有不同的地方,而足以造成破坏。两者在简洁和间隔尺寸方面各有优势,请合理地选择。

分享到:
评论

相关推荐

    oracle timestamp详解

    oracle timestamp详解 将常用的转换方法及使用注意事项都罗列出来了

    Oracle Timestamp with Time zone & java

    Oracle的Timestamp with Time Zone类型与Java的交互是数据库编程中一个重要的知识点,特别是在处理跨越时区的数据时。本文将深入探讨这两个概念以及它们在实际应用中的互动。 Oracle的Timestamp with Time Zone类型...

    oracle中TIMESTAMP与DATE比较

    在Oracle数据库中,`TIMESTAMP`与`DATE`两种数据类型是用于存储日期和时间信息的关键组成部分,但它们之间存在显著的区别,特别是在处理时间和精度方面。本文将深入探讨这两种数据类型的特点,以及如何在实际应用中...

    oracle --timestamp

    根据提供的标题、描述、标签及部分内容,我们可以了解到这段文本主要涉及Oracle数据库中处理时间戳(`TIMESTAMP`)的相关操作。接下来将详细解释这些内容所包含的关键知识点。 ### 关键知识点解析 #### 1. `...

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

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

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

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

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

    在Oracle数据库中,时间间隔型数据(INTERVAL)的引入极大地增强了对时间处理的灵活性和准确性。在Oracle 9i之前,处理时间间隔通常需要依赖于DATE类型,并将时间间隔转换为秒数存储在NUMBER列中,这在进行时间计算...

    Oracle date 和 timestamp 区别详解

    Oracle数据库中的DATE和TIMESTAMP是两种用于存储日期和时间信息的数据类型,它们在用途和精度上有显著的区别。 1. DATE数据类型: DATE类型是Oracle中最基础的日期时间数据类型,可以存储日期(年、月、日)和时间...

    delphi与ORACLE数据库连接控件odac

    delphi与ORACLE数据库连接控件odac 安装说明 1.找到ODAC_5.70.0.30_FS\Source\Delphi7. 2.Make.bat右键编辑,填入delphi7安装路径. 3.然后运行Make.bat生成bpl文件. 注意: 在安装的时候会出现一个错误: [Fatal ...

    oracle日期时间型timestamp的深入理解

    Oracle数据库中的日期时间型数据类型`timestamp`是一个非常重要的概念,它用于存储精确到纳秒的时间戳信息。本文将深入探讨`timestamp`的使用、转换以及与其他日期时间类型交互的方法。 1. **字符型转成timestamp**...

    oracle中TIMESTAMP与DATE比较.docx

    Oracle 中 TIMESTAMP 与 DATE 比较 Oracle 数据库中 TIMESTAMP 与 DATE 两个数据类型都是用于存储日期和时间的,但是它们之间有着很大的区别。在本文中,我们将详细比较这两个数据类型的特点、使用场景和优缺点。 ...

    oracle中TIMESTAMP与DATE比较.pdf

    Oracle数据库中的`DATE`和`TIMESTAMP`是两种常见的日期和时间数据类型,它们在处理时间信息时有着不同的特性和用途。 首先,`DATE`数据类型是我们最常使用的,它可以存储日期和时间,包括世纪、年、月、日、小时、...

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

    本文将详细探讨如何通过在SQL Server 2005中创建到Oracle 10g的链接服务器,实现异构数据库之间的数据转换方案。 首先,我们需要创建链接服务器。在SQL Server Management Studio中,可以通过右键点击“链接服务器...

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

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

    oracle SCN跟TIMESTAMP之间转换

    Oracle SCN (System Change Number) 和 TIMESTAMP 是两种不同的时间表示方式,它们在Oracle数据库中用于跟踪事务和数据的历史。SCN 是一个全局递增的数字,每次数据库发生改变时都会增加,它代表了数据库中的一个...

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

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

    oracle-java数据类型1

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

    oracle日期时间判断函数

    在Oracle数据库系统中,日期和时间的处理是数据库操作中的重要组成部分。Oracle提供了丰富的日期时间函数,用于处理和分析日期时间数据。针对标题"oracle日期时间判断函数"和描述中提到的内容,我们可以深入探讨两个...

Global site tag (gtag.js) - Google Analytics