错误“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:SSMM-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: 日期格式图片在转换整个输入字符串之前结束

ORA-01830: 日期格式图片在转换整个输入字符串之前结束(增量同步)

ORA-01830

从 ORACLE 数据库中选择数据时遇到 ORA-01830 错误