首页 > 数据库 > 国内数据库 > GBase 8s_NVL函数支持时间格式问题详解
在很多应用场景中,经常会按日期对数据进行存储和查询,也会对日期进行一些必要的运算,如求日期的差值等,本文介绍 GBase 8s 中 NVL 函数对日期差值的支持,有一定参考价值。
在某国产化替代项目中出现如下场景: NVL 函数需要支持时间相减, GBase 8s 中时间相减结果则是 interval 型,包含天 - 时 - 分 - 秒(示例: 1 5:23:12 ),在这种场景下, GBase 8s 会因为 NVL 函数两个输入参数不一致,格式无法转换而报错 “SQL 错误【 ErrorCode : -1260 】【 SQLState : IX000 】: It is not possible to convert between the specified types.” 。如下所示:
源 SQL :
select ceil(60*24*nvl(t.flt_actual_time-t.flt_scheme_time,0)) as delay_time from view_m_dep_executed_flt t;
在 GBase 8s 中执行 SQL 语句进行测试分析,过程如下。
a. 测试表结构
|
col1 |
col2 |
col3 |
col4 |
col5 |
col6 |
|
1 |
2 |
3 |
1 |
2019-10-10 12:12:12 |
2019-10-12 12:23:12 |
b. 测试过程:
l 测试 SQL
SQL1 : select col6-col5 from table1; (测试时间相减输出结果类型)
SQL2 : select nvl(col6-col5,col5-col5) from table1; (测试 NVL 函数输入两个日期相减类型)
SQL3 : select nvl(col6-col5,0) from table1; (仿用户场景测试)
l 测试结果:
SQL1 : GBase 8s 正常执行,但返回 interval 型结果,以天 - 时 - 分 - 秒形式,例如 1 00:12:00 ;
SQL2 : GBase 8s 正常执行,但返回 interval 型结果。
SQL3 : GBase 8s NVL 函数执行失败,输入参数第一个为 interval 型,第二个参数为数值型,报语法错误: “SQL 错误【 ErrorCode : -1260 】【 SQLState : IX000 】: It is not possible to convert between the specified types.”
经分析测试,造成现状描述中问题的原因是: GBase 8s 数据 NVL 函数两个输入参数需类型一致或能进行隐式类型转换,才可执行成功,但目前日期相减结果为 interval 型,无法与数值型顺利相互转换,所以报格式转换错误。
GBase 8s 数据库会加强兼容性方面的功能支持,以支持上述场景,降低从主流数据库迁移到 GBase 8s 数据库的适配难度,提供更强大的兼容能力。
由问题分析可知,解决方案如下:
GBase 8s NVL 函数在两个参数为 interval 时间格式和数值型参数情况下,支持隐式类型转换,函数可顺利执行,以达到与主流数据库兼容的目的。
具体如下:
Ø 在第一个参数是 interval 型,第二个参数是数值型情况下,需要将 interval 转换成 float 型,默认单位为天;
Ø 在第一个参数是数值型,第二个参数是 interval 型情况下,如果数值型不为 null ,则直接返回该数值型,否则,将 interval 转换成以天为单位的 float 型,作为函数返回值。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69980637/viewspace-2730439/ ,如需转载,请注明出处,否则将追究法律责任。