【问题标题】:Oracle sql: ORA-01830 when date calculation happensOracle sql:发生日期计算时出现 ORA-01830
【发布时间】:2015-03-12 13:23:54
【问题描述】:

我想执行以下 oracle SQL 查询

SELECT t1.Technology, count(t1.trax_id) as "Current number of items", to_char(to_date(max(round((SYSDATE - t1.time_event) * 24 * 60 * 60)),'sssss'),'hh24:mi:ss') as "max_ages"
from dm_procmon t1
group by t1.Technology;

问题在于日期减法公式。

我从彼此中减去 2 个日期。这给了我一个十进制值 (如 0,00855605)。我希望该值返回为日期值。所以我 首先将其转换为数字(十进制>数字),然后再转换为 char (Number > Char) 最后从一个 char 到日期 (Char > Date)。

但是当我执行我收到的操作时 错误报告 -

SQL 错误:ORA-01830: Datumnotatieafbeelding eindigt voordat de gehele invoerstring 是 geconverteerd。 01830. 00000 - “日期格式图片在转换整个输入字符串之前结束”

我做错了什么?

【问题讨论】:

  • 请描述一下,你期待什么结果,time_event的内容是什么
  • 我从彼此中减去 2 个日期。这给了我一个十进制值(如 0,00855605)。我想回到日期值。所以我首先将其转换为数字,然后转换为字符,然后再转换为日期。

标签: sql oracle compiler-errors


【解决方案1】:

您尝试转换为_date(%number of seconds%, 'sssss'),这就是问题所在。只需使用TO_CHAR(MAX(TO_DATE('20000101','yyyymmdd')+(SYSDATE - t1.time_event)),'hh24:mi:ss');这将在 的时间间隔内正常运行

【讨论】:

  • 当你应该溢出 1 天的间隔时,使用自己的函数而不是执行舍入和乘法的 TO_CHAR,例如0,00855605 : 0d, *24=0,2053452 : 0h, *60=12,320712 : 12m, *60=19,24272 : 19s (0d0h12m19s) 并返回此结果...
  • 通常不会发生这种情况。一个 id 通常在系统中保留半天。但我一直牢记在心。
  • 或者通过简单的调整,您可以在 20001130,2. 格式'dd:hh24:mi:ss'
【解决方案2】:

这是一个对最大间隔大小没有任何限制的通用解决方案:

select Technology, cnt as "Current number of items", FLOOR(x) || ':' || TO_CHAR(TO_DATE('20000101','yyyymmdd')+(x - FLOOR(x)),'hh24:mi:ss') as "max_ages"
from
    (select t1.Technology, COUNT(t1.trax_id) cnt, MAX(SYSDATE - t1.time_event) x
    from dm_procmon t1
    group by t1.Technology);

FLOOR(x) 返回天数,其余的 (x - FLOOR(x)) 被添加到常量日期并转换为小时、分钟和秒

【讨论】:

    【解决方案3】:

    以下将给出一个DAY TO SECOND INTERVAL,表示相距约 68 年的所有日期:

    SELECT t1.technology, COUNT(t1.trax_id) AS "Current number of items"
         , NUMTODSINTERVAL(ROUND((SYSDATE - MIN(t1.time_event) * 24 * 60 * 60), 'SECOND') AS "max_ages"
      FROM dm_procmon t1
     GROUP BY t1.technology;
    

    请注意,我使用的是SYSDATE-MIN(time),而不是MAX(SYSDATE - time)(逻辑上相同)。使用它而不是 TO_CHAR() 的优点是您可以使用 DATE/INTERVAL 算术中返回的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-13
      • 2013-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多