错误“ORA-01830”:日期格式图片在转换整个输入字符串之前结束(Oracle 错误)
Posted
技术标签:
【中文标题】错误“ORA-01830”:日期格式图片在转换整个输入字符串之前结束(Oracle 错误)【英文标题】:Error "ORA-01830": date format picture ends before converting entire input string (Oracle Error) 【发布时间】:2015-09-15 08:07:52 【问题描述】:请帮忙,这是我的查询:
SELECT a.verifierid, a.peerverifier, periode AS last_periode,
endToEndDelayMedian / 1000 AS x_medianroundtriplatency,
medianJitter / 1000 AS x_maxjitter, percentLostPackets,
CASE
WHEN (endToEndDelayMedian / 1000) < 80
AND (endToEndDelayMedian / 1000) > 0 THEN
1
WHEN 80 <= (endToEndDelayMedian / 1000)
AND (endToEndDelayMedian / 1000) < 100 THEN
2
ELSE
3 end as sign_latency,
CASE
WHEN (medianJitter / 1000) < 5
AND (medianJitter / 1000) > 0
THEN 1
WHEN 5 <= (medianJitter / 1000)
AND (medianJitter / 1000) < 30
THEN 2
ELSE 3
END AS sign_jitter,
CASE
WHEN percentLostPackets < 0.5
THEN 1
WHEN 0.5 <= (percentLostPackets)
AND (percentLostPackets) < 1
THEN 2
ELSE 3
END AS sign_packetlost,
last_update
FROM (select to_char(case when periode like '201%' then to_date(periode,'yyyy-mm-dd hh24:mi:ss')
else to_date(periode,'mm-dd-yyyy hh24:mi:ss') end,'YYYY-MM-DD hh24:mi:ss') periodex, a.*
from nextone_brix_l3*** a ) a
INNER JOIN
(SELECT verifierid, peerverifier, MAX (periode) AS last_periode
FROM nextone_brix_l3***
GROUP BY verifierid, peerverifier) b
ON a.verifierid = b.verifierid
AND a.peerverifier = b.peerverifier
AND periode = b.last_periode
where 1=1 and to_char(periodex,'yyyy-mm-dd hh24:mi:ss') between SYSDATE - INTERVAL '24' HOUR AND SYSDATE and rownum<=10
ORDER BY sign_packetlost DESC,
sign_latency DESC,
sign_jitter DESC,
verifierid ASC
错误“ORA-01830”:日期格式图片在转换完整之前结束 输入字符串(Oracle 错误)
【问题讨论】:
我已更新您的text formatting。但是,请始终关注您其他帖子中的text formatting。 如果没有看到您的一些数据,这将很困难。您的数据中至少有一个字符串日期值与您应用 TO_DATE 的日期格式不匹配。 是的@Ollie 认为这是我的问题,但我不知道如何解决。我的客户桌上有 65661056 个记录器。这是来自列 PERIODE = 2015-08-20 00:00:04 的示例数据 @r5d 谢谢提醒 【参考方案1】:你的问题出在日期
to_date(periode,'yyyy-mm-dd hh24:mi:ss')
else to_date(periode,'mm-dd-yyyy hh24:mi:ss') end,'YYYY-MM-DD hh24:mi:ss') periodex, a.*
from nextone_brix_l3*** a ) a
period 的值是多少?应该是这样的'15/09/2015 00:00:00'
示例:select To_date ('15/09/2015 00:00:00', 'DD/MM/YYYY HH24:MI:SS')
From DUAL;
【讨论】:
【参考方案2】:您已指定 PERIODE 中的数据可以是 YYYY-MM-DD HH24:MI:SS
或 MM-DD-YYYY HH24:MI:SS
。
在您的数据中的某处,这种预期的格式不成立。
您可以使用以下方法进行测试:
SELECT to_char(
case
when periode like '201%' then to_date(periode,'yyyy-mm-dd hh24:mi:ss')
else to_date(periode,'mm-dd-yyyy hh24:mi:ss')
end,
'YYYY-MM-DD hh24:mi:ss') periodex
FROM nextone_brix_l3***;
运行它会导致您在原始代码中看到的 ORA-01830 错误。
要确定错误记录的位置,请尝试以下操作:
SET SERVEROUTPUT ON
DECLARE
v_converted_date DATE;
BEGIN
-- Enable the DBMS_OUTPUT buffer
DBMS_OUTPUT.ENABLE(1000000);
-- Start your output
DBMS_OUTPUT.PUT_LINE('Starting loop');
-- Loop through your data table
FOR i IN (SELECT rowid, periode FROM nextone_brix_l3***)
LOOP
-- Start a new Pl/SQL block
BEGIN
-- Try your data conversion
v_converted_date := CASE
WHEN i.periode LIKE '201%'
THEN TO_DATE(i.periode,'yyyy-mm-dd hh24:mi:ss')
ELSE TO_DATE(i.periode,'mm-dd-yyyy hh24:mi:ss')
END;
EXCEPTION
-- Trap the exception and output the rowed of the problem record
WHEN others
THEN
DBMS_OUTPUT.PUT_LINE('Error: '||sqlcode||', caused by record at row: '||i.rowid||' with PERIODE value: '||i.periode);
END;
END LOOP;
-- End your output
DBMS_OUTPUT.PUT_LINE('Loop finished');
EXCEPTION
-- Trap any other exceptions and report them
WHEN others
THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
这应该会输出导致格式问题的记录列表。
Caveats:
-
我没有用于测试此代码的 SQL 会话,因此您可能需要稍微修改一下才能使其正常工作
除了使用 DBMS_OUTPUT 之外,还有其他方法可以输出记录,因此您可以随意使用,但对您来说最简单
是的,这意味着您必须遍历 65m 记录中的任何一条,并且有人可能会建议一种更快的纯 SQL 方法来识别问题记录
正是出于这个原因,您不应该将日期作为 VARCHAR 存储在数据库中,如果是日期,请将其存储在
DATE
数据类型中!
希望对你有帮助!
【讨论】:
非常感谢@Ollie 和***.com,你很有帮助。如何在***.com 给你一个感谢的见证?我是这里的新手。 @FaisalTahir,您已经完成了将答案标记为正确的工作。很高兴我能帮上忙。以上是关于错误“ORA-01830”:日期格式图片在转换整个输入字符串之前结束(Oracle 错误)的主要内容,如果未能解决你的问题,请参考以下文章
ORA-01830: 日期格式图片在转换整个输入字符串之前结束
我在解析 XML 文件时收到 ORA-01830:日期格式图片在转换整个输入字符串之前结束
[技术分享]20171129_mybatis _ ORA-01830: 日期格式图片在转换整个输入字符串之前结束