Oracle TO_CHAR()函数中的错误

Oracle TO_CHAR()函数中的错误

问题描述:

为什么下面的查询的第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

那么,它是没有上线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') 

您正在比较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