2009-11-10 49 views
1

爲什麼下面的查詢的第7行發生以下錯誤?Oracle TO_CHAR()函數中的錯誤

Error: ORA-01861: literal does not match format string

Query:

01: SELECT hour 
02: FROM (WITH all_hours AS 
03:    (SELECT TO_DATE ('2000-01-01', 'yyyy-mm-dd') 
04:      + NUMTODSINTERVAL (LEVEL - 1, 'hour') hour 
05:    FROM DUAL 
06:    CONNECT BY LEVEL <= 1000000) 
07:  SELECT TO_CHAR (h.hour, 'yyyy-mm-dd hh:mi am') hour 
08:  FROM all_hours h 
09:  GROUP BY h.hour) 
10: WHERE hour BETWEEN TO_DATE ('2009-11-10 01:00 am', 'yyyy-mm-dd hh:mi am') 
11:    AND TO_DATE ('2009-11-10 01:00 am', 'yyyy-mm-dd hh:mi am') 
+0

日期的時間部分對你正在做什麼很重要? – ChadNC 2009-11-10 16:58:46

回答

6

那麼,它是沒有上線7問題是,在一定程度上的「小時」被轉換成字符串(TO_CHAR),但在此之後進行比較日期和隱式轉換不會始終工作。更正後的查詢:

SELECT hour 
FROM (WITH all_hours AS 
      (
      SELECT TO_DATE ('2000-01-01', 'yyyy-mm-dd') 
        + NUMTODSINTERVAL (LEVEL - 1, 'hour') hour 
      FROM DUAL 
      CONNECT BY LEVEL <= 1000000 
      ) 
    SELECT TO_CHAR (h.hour, 'yyyy-mm-dd hh:mi am') hour, h.hour as hourdate 
    FROM all_hours h 
    GROUP BY h.hour) 
WHERE hourdate BETWEEN TO_DATE ('2009-11-10 01:00 am', 'yyyy-mm-dd hh:mi am') 
       AND TO_DATE ('2009-11-10 01:00 am', 'yyyy-mm-dd hh:mi am') 
1

您正在比較DATE到WHERE子句中的CHAR。這應該工作:

SQL> SELECT TO_CHAR(hour, 'yyyy-mm-dd hh:mi am') 
    2 FROM (WITH all_hours AS (SELECT TO_DATE('2000-01-01', 'yyyy-mm-dd') 
    3        + NUMTODSINTERVAL(LEVEL - 1, 'hour') hour 
    4        FROM DUAL 
    5        CONNECT BY LEVEL <= 1000000) 
    6   SELECT hour FROM all_hours h GROUP BY h.hour) 
    7 WHERE hour BETWEEN TO_DATE('2009-11-10 01:00 am', 'yyyy-mm-dd hh:mi am') 
    8   AND TO_DATE('2009-11-10 01:00 am', 'yyyy-mm-dd hh:mi am') 
    9 ; 

TO_CHAR(HOUR,'YYYY-MM-DDHH:MIA 
------------------------------ 
2009-11-10 01:00 am