我在 Oracle 11G 中有一个所谓的 signal_table,其中包含以下列:
信号类型 VarChar(2)
信号时间 VarChar(2)
signal_time 的格式为 HH24:MI:SS(例如“15:35:30”),这意味着应用程序会在每天 15:35:30 触发此类信号。
现在,我正在尝试编写一个查询,列出所有将在 30 秒后触发的信号。
我尝试了类似的东西
select
signal_type,
signal_time,
from
signal_table
where
to_number(to_char(substr(signal_time,1,2)))*3600 + to_number(to_char(substr(signal_time,4,2)))*60 + to_number(to_char(substr(signal_time,7,2))) - to_number(to_char(sysdate,'HH24'))*3600 + to_number(to_char(sysdate,'MI'))*60 + to_number(to_char(sysdate,'SS')) < 30
;
认为我会以秒为单位将 VarChar 时间戳转换为数字。
但是,对于上述查询,我收到“ORA-01722:无效号码”错误。
如下查询可以正常工作:
select
signal_type,
signal_time,
to_number(to_char( substr(signal_time,1,2)))*3600 + to_number(to_char(substr(signal_time,4,2)))*60 + to_number(to_char(substr(signal_time,7,2))) - to_number(to_char(sysdate,'HH24'))*3600 + to_number(to_char(sysdate,'MI'))*60 + to_number(to_char(sysdate,'SS'))
from
signal_table
;
当我将 to_number 演员部分放在 where 子句中时,任何人都可以解释为什么会出现上述错误吗?
更好的是,有没有更优雅的方式来实现这个目标?