我有一个表格,列类型是varchar2,并保存数据,如' 22:00'或" 13:30"。 我试图将该数字与当前时间进行比较,如果当前时间早于该时间,请选择数据。
这是我目前的代码:
select DISTINCT BBT_JOURNEYSTOPS.SERVICE "Service", BBT_JOURNEYSTOPS.STOP_REFERENCE "StopNo",
STOP_NAME "Near", BBT_STOPS.ROAD_NAME "On", BBT_JOURNEYSTOPS.JOURNEYTIME "Duration"
from BBT_JOURNEYSTOPS
inner join BBT_WEEKLYSCHEDULE
on BBT_WEEKLYSCHEDULE.SERVICE = BBT_JOURNEYSTOPS.SERVICE
inner join BBT_STOPS
on BBT_JOURNEYSTOPS.STOP_REFERENCE = BBT_STOPS.STOPREF
where (UPPER(BBT_JOURNEYSTOPS.SERVICE) LIKE UPPER('%'|| :route || '%')) AND
(TO_NUMBER(SUBSTR(BBT_WEEKLYSCHEDULE.TIMEUNTIL, 1, 2)) > (SELECT TO_NUMBER(SYSDATE, 'HH24') "NOW" FROM DUAL));
发生问题的WHERE声明。我得到的错误代码是
ORA-01481: invalid number format model
01481. 00000 - "invalid number format model"
*Cause: The user is attempting to either convert a number to a string
via TO_CHAR or a string to a number via TO_NUMBER and has
supplied an invalid number format model parameter.
*Action: Consult your manual.
答案 0 :(得分:1)
您无法使用日期直接致电TO_NUMBER
。您发生了隐式TO_CHAR
,然后您尝试使用日期格式模型HH24
明确地将该字符串转换为数字,这就是给出该错误的原因。您也不需要针对DUAL的子查询。
而不是:
... > (SELECT TO_NUMBER(SYSDATE, 'HH24') FROM DUAL));
你会用:
... > TO_NUMBER(TO_CHAR(SYSDATE, 'HH24')));
您也可以EXTRACT(HOUR FROM SYSDATE)
。或者,您可以使用今天的日期将时间字符串转换为日期对象,并进行更精确的比较,例如:
... AND TO_DATE(TO_CHAR(SYSDATE, 'YYYY-MM-DD') || ' ' || TIMEUNTIL,
'YYYY-MM-DD HH24:MI') > SYSDATE;
答案 1 :(得分:1)
我认为条件应该是:
SUBSTR(BBT_WEEKLYSCHEDULE.TIMEUNTIL, 1, 2) > to_char(sysdate, 'HH24')
过滤器的这一部分会导致错误:
SELECT TO_NUMBER(SYSDATE, 'HH24') "NOW" FROM DUAL