首页 > 解决方案 > 看到 ORA-01858 发现非数字字符?

问题描述

这是给 oracle sql developer 以下是我的查询

INSERT INTO ENROLLMENTS (DATE,PARTNER_NAME,ENROLLMENTS)
    SELECT TO_CHAR(TS, 'DD-MON-YYYY HH AM') AS DATE, mrch_bnft_cd, COUNT(*)
    FROM ENROLLMENTS 
    WHERE TS > trunc(sysdate-1/24, 'HH') + 5/24 
    AND TS < trunc(sysdate, 'HH') + 5/24
    GROUP BY TO_CHAR(TS, 'DD-MON-YYYY HH AM'), mrch
    ORDER BY TO_CHAR(TS, 'DD-MON-YYYY HH AM'), mrch_bnft

我收到一个错误

ORA-01858: a non-numeric character was found where a numeric was expected error

但错误并没有告诉我在哪里。有任何想法吗?

DATE = TIMESTAMP(6)
TS = TIMESTAMP(6)  
PARTNER = VARCHAR2(35 BYTE)  
ENROLLMENTS = NUMBER  
MRCH_BNFT= VARCHAR2(35 BYTE)

标签: sqloracle

解决方案


这是高度可疑的:

SELECT TO_CHAR(TS, 'DD-MON-YYYY HH AM') AS DATE

为什么要将 a 转换为timestamp字符串以放入名为 的字段中date?如果您希望日期减少到特定小时,请TRUNC()改用:

SELECT TRUNC(TS, 'HH')

所以:

SELECT TRUNC(TS, 'HH') AS DATE, mrch_bnft_cd, COUNT(*)
FROM ENROLLMENTS 
WHERE TS > trunc(sysdate-1/24, 'HH') + 5/24 AND
      TS < trunc(sysdate, 'HH') + 5/24
GROUP BY TRUNC(TS, 'HH'), mrch
ORDER BY TRUNC(TS, 'HH'), mrch_bnft;

我也建议+ interval '5' hour而不是日期算术,但你的版本实际上很好。


推荐阅读