如何掌握 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)]
  列表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