查询从 oracle 11g 中的 systimestamp 中减去日期

query to subtract date from systimestamp in oracle 11g

我想对另一个查询返回的日期和oracle中的系统时间进行减法运算SQL。到目前为止,我已经能够使用另一个查询的结果,但是当我尝试从 systimestamp 中减去时,它给了我以下错误

ORA-01722: invalid number
'01722. 00000 - "invalid number"
*Cause: The specified number was invalid.
*Action: Specify a valid number.

下面是我的查询

select round(to_number(systimestamp - e.last_time) * 24) as lag 
from (
   select ATTR_VALUE as last_time 
   from CONFIG 
   where ATTR_NAME='last_time' 
   and PROCESS_TYPE='new'
)  e;

这个我也试过了

select to_char(sys_extract_utc(systimestamp)-e.last_time,'YYYY-MM-DD HH24:MI:SS') as lag 
from (
   select ATTR_VALUE as last_time 
   from CONFIG 
   where ATTR_NAME='last_time' 
     and PROCESS_TYPE='new'
)  e;

我希望时间间隔之间的差异以小时为单位。

提前感谢您的帮助。

P.S. ATTR_VALUE 的数据类型为 VARCHAR2(150)。 e.last_time 的样本结果是 2016-09-05 22:43:81796

"its VARCHAR2(150). That means I need to convert that to date"

ATTR_VALUE 是一个字符串,所以是的,在尝试将其与另一种数据类型进行比较之前,您需要将其转换为正确的类型。鉴于您的样本数据,正确的类型是时间戳,在这种情况下,您的子查询应该是:

(
   select to_timestamp(ATTR_VALUE, 'yyyy-mm-dd hh24:mi:ss.ff5') as last_time 
   from CONFIG 
   where ATTR_NAME='last_time' 
     and PROCESS_TYPE='new'
)  

假设您的样本代表给定键的 CONFIG table 中的所有值。如果您有不同格式的值,您的查询将以其他方式中断:这就是使用这种方法的危险。

经过反复试验,我终于得到了这个

1. 原来错误最初是因为 e.last_time 的 data_type 是 VARCHAR(150)。 为了找出 table 中给定列的数据类型,我使用了

desc <table_name>

我的情况是 desc CONFIG

2. 要将 VARCHAR 转换为系统时间,我有两个选项 to_timestampto_date。如果我使用 to_timestamp like

select round((systimestamp - to_timestamp(e.last_time,'YYYY-MM-DD HH24:MI:SSSSS')) * 24, 2) as lag 
from (
   select ATTR_VALUE as last_time 
   from CONFIG 
   where ATTR_NAME='last_time' 
   and PROCESS_TYPE='new'
)  e;

我得到一个错误,该轮期望 NUMBER 并得到 INTERVAL DAY TO SECONDS,因为日期差异类似于 +41 13:55:20.663990。将其转换为小时需要复杂的逻辑。

另一种方法是使用 to_data,我更喜欢它并将其用作

select round((sysdate - to_date(e.last_time,'YYYY-MM-DD HH24:MI:SSSSS')) * 24, 2) as lag 
from (
   select ATTR_VALUE as last_time 
   from CONFIG 
   where ATTR_NAME='last_time' 
   and PROCESS_TYPE='new'
)  e;

这 returns 我想要的结果,即四舍五入到 2 个浮点数的小时差