2009-11-10 4 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

답변

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

WHERE 절에서 DATE와 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