在ORACLE SQL中使用带小数的替代

时间:2017-02-23 15:53:17

标签: sql oracle

我需要以给定的格式减去2个时间戳:

16/01/17 07:01:06,165000000 
16/01/17 07:01:06,244000000

我想用2个十进制值表示结果,但是在CAST过程中的某个地方,我正在失去精度。我现在的尝试是这样的:

select 
  id,
  trunc((CAST(MAX(T.TIMESTAMP) AS DATE) - CAST(MIN(T.TIMESTAMP) AS DATE))*24*60*60,2) as result 
from table T
group by id;

但即使我将截断小数设置为2,我得到id_1 '0'作为上述两个时间戳的结果。

有没有办法可以获得0.XX aa减法的结果?

2 个答案:

答案 0 :(得分:3)

这是因为你要将时间戳投射到目前为止。

使用to_timestamp将字符串转换为时间戳。

试试这个:

with your_table(tstamp) as (
  select '16/01/17 07:01:06,165000000' from dual union all
  select '16/01/17 07:01:06,244000000' from dual
),
your_table_casted as (
    select to_timestamp(tstamp,'dd/mm/yy hh24:mi:ss,ff') tstamp from your_table
)
select trunc(sysdate + (max(tstamp) - min(tstamp)) * 86400 - sysdate, 2) diff 
from your_table_casted;

两个时间戳之间的差异为INTERVAL DAY TO SECOND

要将其转换为秒,请使用上述技巧。

答案 1 :(得分:0)

DATE-此数据类型存储日期和时间,解析为秒。它不包括时区。 DATE是用于在Oracle应用程序中处理日期的最早且最常用的数据类型。

TIMESTAMP-时间戳类似于日期,但有两个关键区别:您可以存储和操作已解决的时间到最接近的十亿分之一秒(精确度为9位小数),并且您可以将时区与时间戳,Oracle数据库将在操作时间戳时考虑该时区。

减去两个时间戳的结果是INTERVAL:

INTERVAL - DATE和TIMESTAMP记录特定时间点,INTERVAL记录并计算持续时间。您可以按年和月,或天和秒指定间隔。

您可以找到更多信息here