环境
系统平台:N/A
版本:5.6.5
文档用途
数据迁移的时候,两个时间戳之间间隔了总共多少分钟的SQL语法上不大一样。本文档主要讲述从Oracle或DM(达梦)数据库迁移到瀚高数据库中的语法变化。
详细信息
实例:
有一个表test,包含两个时间戳类型列:starttime和endtime。
这两列相减(starttime - endtime),不同的数据库得到的结果不同,以Oracle、DM(达梦)、瀚高数据库为例来说明。
目标:
得到starttime和endtime之间相差的分钟。
1)Oracle:
时间戳相减实例:
SELECT (TIMESTAMP '2007-07-15 19:00:00'- TIMESTAMP '2007-01-15 10:00:00') FROM DUAL;
结果:+181 09:00:00.000000(时间间隔类型)
由于Oracle时间戳相减得到的是时间间隔类型,所以不能直接将这个结果去乘以24*60,得到的结果不准确。
而DATE类型相减可以得到间隔天数,通过CAST函数将时间戳转换成日期格式,如:
SELECT ( cast(TIMESTAMP '2007-07-15 19:00:00' as date) - cast((TIMESTAMP '2007-01-15 10:00:00') as date )) FROM DUAL;
结果:181.375
这个数值就可以乘以24*60得到分钟数了。
2)DM(达梦):
时间戳相减实例:
SELECT (TIMESTAMP '2007-07-15 19:00:00'- TIMESTAMP '2007-01-15 10:00:00') ;
结果:181.375(float类型)
注意:如果使用时间间隔限定符,得到的结果不一样(我们这里只看一下就行,不做深入讨论)
SELECT (TIMESTAMP '2007-07-15 19:00:00'- TIMESTAMP '2007-01-15 19:00:00') day;
结果:INTERVAL ‘000000181’ DAY(9)
此时得到的是时间间隔类型,如果没有指定时间间隔限定符默认得到的是float类型
3)瀚高数据库:
时间戳相减实例:
SELECT (TIMESTAMP '2007-07-15 19:00:00'- TIMESTAMP '2007-01-15 10:00:00');
结果:181 days 09:00:00(时间间隔类型)
与Oracle相同,所以这种类型也不能用来计算,如果我们直接用来计算会得到这样的结果:
SELECT (TIMESTAMP '2007-07-15 19:00:00'- TIMESTAMP '2007-01-15 10:00:00')*24*60;
结果:260640 days 12960:00:00
这不是我们想要的结果!
函数EXTRACT可以从时间间隔类型中获取间隔的总秒数,如:
select EXTRACT( EPOCH FROM(TIMESTAMP '2007-07-15 19:00:00'- TIMESTAMP '2007-01-15 10:00:00'));
结果:15670800
我们可以这样获取间隔多少天:
select EXTRACT( EPOCH FROM(TIMESTAMP ‘2007-07-15 19:00:00’- TIMESTAMP ‘2007-01-15 10:00:00’))/60/60/24;
结果:181.375
总结:
在不同数据库下目标结果的兼容格式如下:
1、Oracle语句:SELECT ( cast( starttime as date ) - cast( endtime as date ) )2460 FROM test;
2、DM语句:SELECT ( starttime - endtime )2460 FROM test;
3、瀚高语句:SELECT EXTRACT( EPOCH FROM( starttime - endtime ) )/60 FROM test;
这三个SQL结果是相同的。
1416

被折叠的 条评论
为什么被折叠?



