GBase 8s支持的Interval类型数据两种,Year-Month 和Day-Second。
在C语言中, 都用GCIInterval表示,使用子类型区分。
/* hours; range is 0 <= hours <=23 */
/* minutes; range is 0 <= minutes <= 59 */
/* seconds; range is 0 <= seconds <= 59 */
/* gregorian year; range is -4712 <= year <= 9999 */
/* month; range is 1 <= month < 12 */
/* day; range is 1 <= day <= 31 */
/* time */
ub2 GCITimeHH;
ub2 GCITimeMI;
ub2 GCITimeSS;
};
typedef struct GCITime GCITime;
struct GCIDate
{
sb2 GCIDateYYYY;
ub2 GCIDateMM;
ub2 GCIDateDD;
GCITime GCIDateTime;
sb4 fraction;
};
GBase 8s GCI 接口使用指南
南大通用数据技术股份有限公司 12
C
(64
)
SQLT类型
GCIInterval
Year-Month
GCI_DTYPE_INTERVAL_
YM
Interval year to month
SQLT_INTERVAL
_YM
GCIInterval
Day-Second
GCI_DTYPE_INTERVAL_
DS
Interval day to second /
interval day to fraction(5)
SQLT_INTERVAL
_DS
GCI接口在使用Interval类型做数据库访问操作时, 有如下规则:
GCIInterval Year-Month,包含年(范围 0~9999) ,月(范围 0~11)。
GCIInterval Day-Second,包含日期(范围 0~999999999) ,小时(范围 0~23),
分钟(范围0~59) ,秒(范围 0~59), 纳秒(范围 0~999999) 。
关于纳秒, GBase8s 中 interval 的 fraction 类型的位数范围是 1~5,最大只保
留 5 位有效数字,所以纳秒的低 1 位会被舍弃。例如, 对于 interval day to
fraction(5) 的数据,输入值为 9,存入数据库的值为 0。
关于 Interval 类型的内部转换。
在GCI中使用的Interval类型,不包含GBase 8s支持的Interval的其他类型,例如interval-
hour to second ,interval minute to fraction(4)等等。
如果数据库中的interval类型,与GCI使用的类型不一致,会导致数据丢失。为解决这一问
题, 在GCI内部进行了数据转换,规则如下:
1. 取得数据库中interval的类型信息,当Interval类型不一致时,进行转化。
2. 取得数据库中interval的largest qualifier。
3. 将GCI传入的数值,转换成largest qualifier的对应类型。
4. 将转换后的值, 传递到数据
库。 举例说明:
GCI输入值类型为 Interval day to fraction(3) ,值为‘1 2:3:4.005’。
数据库中类型为Interval hour to second。
由于interval类型不同, 需要转换。
数据库中interval类型的largest qualifier是hour ,所以需要将interval day to fraction(3)转
换为 interval hour to second。
1 day等于24 hours,所以转换后为‘26:3:4.005’。由于数据库中的interval类型不包含fraction
部分,所以‘005’会被舍弃,最终传递给数据库的值是‘26:3:4’。