中易网

请问,oracle里面的timestamp类型如何对它的年份进行加减?

答案:1  悬赏:40  
解决时间 2021-03-21 17:10
请问,oracle里面的timestamp类型如何对它的年份进行加减?

例如2007/12/11 13.11.12.000000000

如何将2007变成2006?就是说如何减去一年?
最佳答案
在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中内置的摘要函数不需要与原始单位秒进行相互转换,就可以报告总的持续时间和平均持续时间。

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

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

EXTRACT(timepart FROM interval_expression)

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

CODE: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

列表B
首先,从experiment_duration列中将天数提取出来,文字“Days”是与之相联的。对于实验持续时间中的小时和分钟部分,操作与上述方法一样。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
在三国演义里面,孟优和孟获之间的关系是什么
四冲程柴油机与汽油机在工作原理上有什么不同
请问一下老师,我想上中职学校高辅班考试分数
一般香水容量多少ml,75ml算大吗?
兰州双美胶原蛋白丰太阳穴的效果怎么样?
瑞兴利翡翠坊怎么去啊,我要去那办事
刘美含到底多大年龄?
龙8有都有些什么如何呢
太空中一个静止的人受到哪两个平衡力的作用
避风塘汉堡加盟不是免费?
脖子上被闺蜜印的大草莓,怎么才能消掉呀,。
一堆沙子重20克,甲车每次运4吨,乙车每次运2
理光SC4500打印机打印复印扫描都不行是什么问
greenbean复数是什么
一套房子三房两厅120平方,装修大概要多少钱
推荐资讯
中国移动通信龙城专营店地址在哪,我要去那里
哪个牌子的彩妆工具比较好呢?什么毛的彩妆刷
vivo输入法怎么打出特殊图案
z465 主板上的硬盘接口是2.0还是3.0
上海立信会计学院分数高吗?
feel free to contact me是什么意思
天津红桥区丁字沽三号路千里堤二号 邮编是多
怎样给DevExpress XtraTreeList添加行的序号
医保卡在银行已激活但在药店刷不了怎么办?
长治叶建美容美发化妆学校在什么地方啊?
开水里放冰块,上面有一层白色的薄膜
看书软件,要看着舒服的!
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?