ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 如何掌握 Oracle 中的时间间隔型数据(转)

如何掌握 Oracle 中的时间间隔型数据(转)

原创 Linux操作系统 作者:jcszjswkzhou 时间:2019-06-23 12:57:07 0 删除 编辑
如何掌握 Oracle 中的时间间隔型数据,时间间隔,Oracle基础

在9i 版本以前Oracle 没有内置的方式来记录时间的流逝DATE型数据用来记录单独的时间点;但是要表达一个时间量(也就是一个间隔)数据库的设计者就必须把时间间隔转换成原始单位秒然后用一个NUMBER列来保存它

虽然NUMBER这个数据类型可以以秒为单位准确地表示时间但是它使得时间的计算变得很困难比如60秒是1分钟60分钟是1个小时24个小时等于1天——这些数字在以十进制为基础的数字系统中都是非常蹩脚的

在Oracle 9i中按照SQL 99标准增加了时间间隔型数据INTERVAL YEAR TO MONTH 和 INTERVAL DAY TO SECOND它们和其他几种数据类型一起使得对时间的处理更加准确TIMESTAMP、TIMESTAMP WITH TIME ZONE和TIMESTAMP WITH LOCAL TIME ZONE等数据类型都把时间的表达精确到了若干分之一秒而且后面两种还解决了地理位置造成的时间变化

在SQL和PL/SQL中你都可以用时间间隔型数据它们都是用同一种方式规定的:

INTERVAL YEAR[(year_precision)] TO MONTH

INTERVAL DAY[(day_precision)] TO SECOND[(fractional_seconds_precision)]

对于精确数值规定有缺省值:年和日是两位数若干分之一秒是六位数

时间间隔的大小由INTERVAL来表示后面紧接一个放在单引号中的表达式以及用来解释该表达式的文字用YEAR TO MONTH表示时间间隔大小时要在年和月之间用一个连字符(-) 连接而DAY TO SECOND表示时间间隔大小时要在日和时间之间用一个空格连接举个例子来说下面是2年6个月的时间间隔的表示方法:

INTERVAL '2-6' YEAR TO MONTH

下面的例子表示3天12个小时30分钟6.7秒:

INTERVAL '3 12:30:06.7' DAY TO SECOND(1)

时间间隔可以为正也可以为负它们可以从各种TIMESTAMP数据类型中加上或者减去从而得到一个新的TIMESTAMP数据类型它们之间也可以做加减运算得到新的时间间隔

列表A说明了怎样创建一个表格来记录一个事件的开始时间和持续时间如实验等数据被收集以后SQL中内置的摘要函数不需要与原始单位秒进行相互转换就可以报告总的持续时间和平均持续时间

列表A

CREATE TABLE experiment

(experiment_id NUMBER(9),

experiment_desc VARCHAR2(80),

experiment_start TIMESTAMP,

experiment_duration INTERVAL DAY(1) TO SECOND(4)

);

Table created.

INSERT INTO experiment

VALUES (

1, 'Busted urban myth', '01-JUN-2006 02:00:00 PM',

INTERVAL '1 2:31:15.1250' DAY(1) TO SECOND(4)

);

1 row created.

col experiment_desc format a40

col experiment_start format a30

col experiment_duration format a20

SELECT * FROM experiment;

EXPERIMENT_ID EXPERIMENT_DESC ------------- ---------------------------------------- EXPERIMENT_START EXPERIMENT_DURATION ------------------------------ -------------------- 1 Busted urban myth 01-JUN-06 02.00.00.000000 PM +1 02:31:15.1250

-- Now compute the experiment's ending time

SELECT experiment_id, experiment_start,

experiment_start + experiment_durationexperiment_end

FROM experiment;

EXPERIMENT_ID EXPERIMENT_START ------------- ------------------------------ EXPERIMENT_END --------------------------------------------------------------------------- 1 01-JUN-06 02.00.00.000000 PM 02-JUN-06 04.31.15.125000000 PM

但遗憾的是 TO_CHAR函数中没有包括任何能够映射到各个时间间隔数据类型片段的格式模型但是你可以用新的EXTRACT函数来提取和合并这些片段格式如下:

EXTRACT(timepart FROM interval_expression)

列表B给出了一个运用这种方法的例子

列表B

SELECT EXTRACT(DAY FROM experiment_duration) ||

' days, ' || EXTRACT (HOUR FROM experiment_duration) ||

' hours, ' || EXTRACT (MINUTE FROM experiment_duration) ||

' minutes' Duration

FROM experiment;

DURATION

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

1 days, 2 hours, 31 minutes

首先从experiment_duration列中将天数提取出来文字“Days”是与之相联的对于实验持续时间中的小时和分钟部分操作与上述方法一样


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10294527/viewspace-122127/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2007-08-29

  • 博文量
    3488
  • 访问量
    2621315