2015-04-21 53 views
0

我有一個表格,其中的列類型是varchar2,並保存諸如'22:00'或「13:30」之類的數據。 我試圖將該數字與當前時間進行比較,如果當前時間在該時間之前,請選擇數據。Oracle SQL字符串到數字轉換

這裏是我當前的代碼:

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. 

回答

1

您不能直接用日期調用TO_NUMBER。你有一個隱含的TO_CHAR發生,然後你試圖使用日期格式模型HH24明確地將該字符串轉換爲數字,這就是給出該錯誤的原因。您不需要針對DUAL的子查詢。

相反的:

... > (SELECT TO_NUMBER(SYSDATE, 'HH24') FROM DUAL)); 

你可以使用:

... > TO_NUMBER(TO_CHAR(SYSDATE, 'HH24'))); 

您也可以EXTRACT(HOUR FROM SYSDATE)。另外,您可以使用今天的日期的時間字符串轉換爲Date對象,並對比更確切地說,喜歡的東西:

... AND TO_DATE(TO_CHAR(SYSDATE, 'YYYY-MM-DD') || ' ' || TIMEUNTIL, 
    'YYYY-MM-DD HH24:MI') > SYSDATE; 
1

我認爲條件應該是:

SUBSTR(BBT_WEEKLYSCHEDULE.TIMEUNTIL, 1, 2) > to_char(sysdate, 'HH24') 

你的過濾器導致此部分錯誤:

SELECT TO_NUMBER(SYSDATE, 'HH24') "NOW" FROM DUAL