Oracle 11g 计算时间差 - 解决数据类型不一致错误
Oracle 11g 计算时间差 - 解决数据类型不一致错误
错误提示
SQL 错误 [932] [42000]: ORA-00932: 数据类型不一致: 应为 NUMBER, 但却获得 INTERVAL DAY TO SECOND
原因:
在 Oracle 11g 中,END_TIME - BEGIN_TIME 计算得到的结果是一个 INTERVAL DAY TO SECOND 类型的值,而 ROUND((END_TIME - BEGIN_TIME) * 86400) 的计算需要一个 NUMBER 类型的值,导致数据类型不一致。
优化后的 SQL 语句:
SELECT DICOM_PK, FILE_SIZE, ROUND((END_TIME - BEGIN_TIME) * 86400), SPEED4CLOUD
FROM T_FILE_TRANSPORT_LOG
WHERE INSERT_DATE BETWEEN TO_DATE('2023-04-15', 'yyyy-mm-dd') AND TO_DATE('2023-04-16', 'yyyy-mm-dd')
AND END_TIME IS NOT NULL AND BEGIN_TIME IS NOT NULL
AND DICOM_PK IS NOT NULL
AND FILE_SIZE IS NOT NULL
AND SPEED4CLOUD IS NOT NULL
AND (END_TIME - BEGIN_TIME) IS NOT NULL;
-- 加上最后一行判断时间差不为空的条件,避免计算出来的结果与数据类型不匹配
解释:
在优化后的语句中,我们添加了 AND (END_TIME - BEGIN_TIME) IS NOT NULL 条件。这个条件确保了时间差计算的结果是一个有效的 INTERVAL DAY TO SECOND 类型值,从而避免了数据类型不一致的错误。
总结:
在 Oracle 11g 中计算时间差时,需要特别注意数据类型。如果计算结果是 INTERVAL DAY TO SECOND 类型,而需要 NUMBER 类型,则需要进行类型转换。通过添加条件判断时间差是否为空,可以有效地避免数据类型不一致的错误。
原文地址: https://www.cveoy.top/t/topic/nwDA 著作权归作者所有。请勿转载和采集!