java nvl函数_GBase 8s_NVL函数支持时间格式问题详解 PDF 下载

主要内容:

1概述

在很多应用场景中,经常会按日期对数据进行存储和查询,也会对日期进行一些必要的运算,如求日期的差值等,本文介绍GBase 8s中NVL函数对日期差值的支持,有一定参考价值。

2问题现状

2.1现状描述

在某国产化替代项目中出现如下场景: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;

2.2问题分析

在GBase 8s中执行SQL语句进行测试分析,过程如下。

a.测试表结构

col1col2col3col4col5col6

12312019-10-10 12:12:122019-10-12 12:23:12

b.测试过程:

测试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; (仿用户场景测试)

测试结果:

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.”

2.3问题总结

经分析测试,造成现状描述中问题的原因是:GBase 8s数据NVL函数两个输入参数需类型一致或能进行隐式类型转换,才可执行成功,但目前日期相减结果为interval型,无法与数值型顺利相互转换,所以报格式转换错误。

GBase 8s数据库会加强兼容性方面的功能支持,以支持上述场景,降低从主流数据库迁移到GBase 8s数据库的适配难度,提供更强大的兼容能力。

3解决方案

由问题分析可知,解决方案如下:

GBase 8s NVL函数在两个参数为interval时间格式和数值型参数情况下,支持隐式类型转换,函数可顺利执行,以达到与主流数据库兼容的目的。

具体如下:

在第一个参数是interval型,第二个参数是数值型情况下,需要将interval转换成float型,默认单位为天;

在第一个参数是数值型,第二个参数是interval型情况下,如果数值型不为null,则直接返回该数值型,否则,将interval转换成以天为单位的float型,作为函数返回值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值