- 浏览: 229850 次
- 性别:
- 来自: beijing
文章分类
我们都知道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的时候,需要注意,它们既有类似的地方,更有不同的地方,而足以造成破坏。两者在简洁和间隔尺寸方面各有优势,请合理地选择。
发表评论
-
利用工具将shp文件导入到oracle spatial中
2012-05-21 14:20 43901 下载shp2sdo 工具,将工具放在 oracle按照目录 ... -
oracle s
2012-06-20 09:18 969<pre name="code" c ... -
oracle spatial 空间数据学习
2012-05-17 16:09 1785最近项目使用 空间数据库 oracle spatial ... -
树-Oracle用Start with...Connect By子句递归查询
2010-12-23 15:41 1181转 。。。。。。。。。。。。。。。。。。。。。。。。。 St ... -
无聊写的oracle 存储过程
2010-09-27 11:37 968create or replace procedure qin ... -
oracle中判断某个字段是否存在
2010-08-30 16:43 4381oracle中判断某个字段是否存在 docum ... -
Oracle 10g for Solaris 安装
2010-07-26 16:25 11181 .首先设置核心系统参数 # vi /etc/sy ... -
Oracle job 的写法
2010-04-29 14:22 1369写了一个job 很简单的,一分钟内 想一个表内插入 一 ... -
drop>; truncate >; delete
2010-03-09 20:40 832注意:这里说的delete是指 ... -
arcgis SDE for Java
2010-03-04 12:32 4139API:http://edndoc.esri.com/arcs ... -
sys_guid()
2010-02-01 21:26 1026select sys_guid() from dual -
Oracle 数据双机热备
2009-09-11 13:48 1812XXX公司ORACLE双机热备份 ... -
Oracle 导出视图view中的数据
2009-09-11 13:33 8866众所周知 Oracle 中的view是不存储数据的,想导出视 ... -
Oracle中TO_DATE TO_CHAR格式
2009-03-26 11:05 1932TO_DATE格式(以时间:2007-11-02 13 ... -
安装Oracle 10g 出现的问题
2009-03-26 11:32 1051Oracle 10G 对Oracle 9i 来说是一个巨大的 ... -
Oracle10g EM 无法登录出现调试出现一系列问题的调试。
2009-03-27 22:52 2186实际操作成功过,真实有效。 友情提示:对于多网卡机器上安 ...
相关推荐
oracle timestamp详解 将常用的转换方法及使用注意事项都罗列出来了
Oracle的Timestamp with Time Zone类型与Java的交互是数据库编程中一个重要的知识点,特别是在处理跨越时区的数据时。本文将深入探讨这两个概念以及它们在实际应用中的互动。 Oracle的Timestamp with Time Zone类型...
在Oracle数据库中,`TIMESTAMP`与`DATE`两种数据类型是用于存储日期和时间信息的关键组成部分,但它们之间存在显著的区别,特别是在处理时间和精度方面。本文将深入探讨这两种数据类型的特点,以及如何在实际应用中...
根据提供的标题、描述、标签及部分内容,我们可以了解到这段文本主要涉及Oracle数据库中处理时间戳(`TIMESTAMP`)的相关操作。接下来将详细解释这些内容所包含的关键知识点。 ### 关键知识点解析 #### 1. `...
在Oracle数据库中,`TIMESTAMP` 是一种用于存储日期和时间数据类型的字段,与传统的`DATE`类型相比,它的精度更高,能够精确到小数秒。`TIMESTAMP` 类型的精度可设置为 0 到 9 位,缺省情况下是 6 位,这意味着它...
名称:MILLISECONDS2TIMESTAMP 功能:将1970-01-01 00:00:00以来的毫秒数转换为对应的timestamp时间类型,精确保留毫秒级精度! 参数:I_MILLISECONDS NUMBER 待转换的毫秒数 示例:select MILLISECONDS2...
在Oracle数据库中,时间间隔型数据(INTERVAL)的引入极大地增强了对时间处理的灵活性和准确性。在Oracle 9i之前,处理时间间隔通常需要依赖于DATE类型,并将时间间隔转换为秒数存储在NUMBER列中,这在进行时间计算...
Oracle数据库中的DATE和TIMESTAMP是两种用于存储日期和时间信息的数据类型,它们在用途和精度上有显著的区别。 1. DATE数据类型: DATE类型是Oracle中最基础的日期时间数据类型,可以存储日期(年、月、日)和时间...
delphi与ORACLE数据库连接控件odac 安装说明 1.找到ODAC_5.70.0.30_FS\Source\Delphi7. 2.Make.bat右键编辑,填入delphi7安装路径. 3.然后运行Make.bat生成bpl文件. 注意: 在安装的时候会出现一个错误: [Fatal ...
Oracle数据库中的日期时间型数据类型`timestamp`是一个非常重要的概念,它用于存储精确到纳秒的时间戳信息。本文将深入探讨`timestamp`的使用、转换以及与其他日期时间类型交互的方法。 1. **字符型转成timestamp**...
Oracle 中 TIMESTAMP 与 DATE 比较 Oracle 数据库中 TIMESTAMP 与 DATE 两个数据类型都是用于存储日期和时间的,但是它们之间有着很大的区别。在本文中,我们将详细比较这两个数据类型的特点、使用场景和优缺点。 ...
Oracle数据库中的`DATE`和`TIMESTAMP`是两种常见的日期和时间数据类型,它们在处理时间信息时有着不同的特性和用途。 首先,`DATE`数据类型是我们最常使用的,它可以存储日期和时间,包括世纪、年、月、日、小时、...
本文将详细探讨如何通过在SQL Server 2005中创建到Oracle 10g的链接服务器,实现异构数据库之间的数据转换方案。 首先,我们需要创建链接服务器。在SQL Server Management Studio中,可以通过右键点击“链接服务器...
oracle中日期类型与unix 时间戳的转换, Unix时间戳记是从'1970-01-01 00:00:00'GMT开始的秒数,表现为整数型。 Oracle中的时间是Date型,以下函数提供了两种时间转换的Oracle函数 --unix时间戳与date时间互转 ...
Oracle SCN (System Change Number) 和 TIMESTAMP 是两种不同的时间表示方式,它们在Oracle数据库中用于跟踪事务和数据的历史。SCN 是一个全局递增的数字,每次数据库发生改变时都会增加,它代表了数据库中的一个...
1主要针对连接oracle数据库代码 2解决[Err] ORA-01830: date format picture ends before converting entire input string报错问题代码,主要是将timestamp数据类型进行格式化成正常数据
- `TIMESTAMP`, `TIMESTAMP WITH TIME ZONE`, `TIMESTAMP WITH LOCAL TIME ZONE` 类型对应 Oracle 的时间戳类型,没有标准的 JDBC 类型,但可以通过 `oracle.jdbc.OracleTypes.TIMESTAMP` 等访问 3. **用户定义的...
在Oracle数据库系统中,日期和时间的处理是数据库操作中的重要组成部分。Oracle提供了丰富的日期时间函数,用于处理和分析日期时间数据。针对标题"oracle日期时间判断函数"和描述中提到的内容,我们可以深入探讨两个...