Oracle数据转换:ORA-01722:无效的数字

时间:2014-09-26 09:44:41

标签: sql oracle

将varchar2列值转换为Number时出错 我无法将varchar2值字段与另一个值进行比较 像这样' 10:54'使用' 11.00',我必须将分钟与分钟字段进行比较。 怎么可能?

查询是:

select 
adm_emp_num,adm_emp_nam,adm_ace_dte,asm_sft,asm_ed_tme,asm_st_tme,adm_ace_tme from Adm,asm
where adm_ace_dte =ass_sft_dte
and to_char(adm_ace_dte,'YYYYMM')=201409
--having min(to_char(adm_ace_tme,'HH24:MI')) < asm_st_tme
having min(to_char(adm_ace_tme,'HH24:MI')) < to_char(to_number(asm_st_tme,'99999
9.99'),'999999.99')
group by adm_emp_num,adm_emp_nam,adm_ace_dte,asm_sft,asm_ed_tme,asm_
st_tme,adm_ace_tme
order by 1,2

参考链接中的表结构: https://stackoverflow.com/review/suggested-edits/5861972

任何帮助将不胜感激 感谢

3 个答案:

答案 0 :(得分:2)

使用EXTRATC function获取微小分数。例子:

  • 来自TIMESTAMP类型:

    SELECT EXTRACT(MINUTE FROM SYSTIMESTAMP) FROM DUAL;
    
  • 来自DATE类型:

    SELECT EXTRACT(MINUTE FROM CAST(SYSDATE AS TIMESTAMP)) FROM DUAL;
    
  • 来自VARCHAR2类型的
  • (例如:11:30):

    SELECT EXTRACT(MINUTE FROM TO_TIMESTAMP('11:30', 'HH24:MI')) FROM DUAL;
    

答案 1 :(得分:0)

你可以这样做:

select to_number(to_char(to_date('12:56', 'hh24:mi'), 'mi')) from dual;

即。首先将您的字符串转换为有效的date,然后提取minute部分(通过在格式中仅指定'mi'),然后将其转换为数字。

然后您可以进行比较:

...where to_number(to_char(to_date('12:56', 'hh24:mi'), 'mi')) = ...

你当然可以解析子字符串,但是你会容易受到无效分钟的影响,比如79.

答案 2 :(得分:0)

您可以对您的值进行子字符串并将其转换为数字,例如:

...
WHERE TO_NUMBER(SUBSTR('10:54',4,2)) >= TO_NUMBER(SUBSTR('11:00',4,2));
--for minutes

...
WHERE TO_NUMBER(SUBSTR('10:54',1,2)) >= TO_NUMBER(SUBSTR('11:00',1,2));
--for hours