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 类型,则需要进行类型转换。通过添加条件判断时间差是否为空,可以有效地避免数据类型不一致的错误。

Oracle 11g 计算时间差 - 解决数据类型不一致错误

原文地址: https://www.cveoy.top/t/topic/nwDA 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录