由于这些数据类型的多字性质, 不可能声明一个名为 year 、 month 、 day 、 hour 、 minute 、second 或 fraction 的未初始化的 datetime 或 interval 主机变量: EXEC SQL BEGIN DECLARE SECTION; datetime year; /* will cause an error */ datetime year to day year, today; /* ambiguous */ EXEC SQL END DECLARE SECTION;
datetime 或 interval 数据类型存储为十进制数,缩放因子为零,精度等于其限定符 隐含的位数。当您了解精度和尺度时,可以知道存储格式。例如:如果将表列定义为 DATETIME YEAR TO DAY,则它包含四位数年份、两位数月份以及两位数日期,一共有 八位数。因此它被存储为 decimal(8,0)。
GBase 8s ESQL/C 编程指南 南大通用数据技术股份有限公司 - 125 -
如果基准十进制值的缺省精度不合适,则可以指定不同的精度。例如,如果您有一个 类型为 interval 的主机变量,具有限定符 day to day,则底层的十进制数的缺省精度为两 位。如果有一百天以上的时间间隔,这个精度是不够的。可以指定三位数的精度如下: interval day(3) to day; datetime 数据类型 使用 datetime 数据类型为 DATETIME 类型的数据库值声明主机变量。使用限定符 指定 datetime 数据类型的准确性。
例如:以下声明中的限定符是 year to day: datetime year to day sale;
声明一个 INTERVAL 列的主机变量,其中 interval 数据类型后面是可选的限定符, 如下所示: EXEC SQL BEGIN DECLARE SECTION; interval day(3) to day accrued_leave, leave_taken; interval hour to second race_length; interval scheduled; EXEC SQL END DECLARE SECTION;
表 4. datetime 和 interval 数据类型的限定符宏 宏的名称 描述 TU_YEAR YEAR 限定符字段的实际单位 TU_MONTH MONTH 限定符字段的实际单位 TU_DAY DAY 限定符字段的实际单位 TU_HOUR HOUR 限定符字段的实际单位 TU_MINUTE MINUTE 限定符字段的实际单位 TU_SECOND SECOND 限定符字段的实际单位 TU_FRAC FRACTION 的前导限定符字段的实际单位 TU_Fn 名称为 datetime 结束字段的 FRACTION(n),n 为 1 - 5 TU_START(q) 从限定符 q 返回前导字段数 TU_END(q) 从限定符 q 返回末尾字段数 TU_LEN(q) 返回限定符 q 中位数的长度 TU_FLEN(f) 返回 interval 限定符的第一个字段的位数长度 TU_ENCODE(p,f,t) 从第一个字段数 f 创建一个限定符,其精度为 p ,尾部字段数 为 t TU_DTENCODE(f,t) 从第一个字段数 f 和尾随的字段数 t 创建一个 datetime 限定 符 TU_IENCODE(p,f,t) 从第一个字段数 f 和尾随的字段数 t 创建一个 interval 限定 符,其精度为 p ,尾部字段为 t
例如:如果您的程序不在主机变量的声明声明中提供 interval 限定符,您需要使用 interval 限定符宏初始化并设置 interval 主机变量。在以下示例中,interval 变量获得一 个 day to second 限定符,限定符中的最长字段的精度 day 设置为 2: /* declare a host variable without a qualifier */ EXEC SQL BEGIN DECLARE SECTION; interval inv1;
GBase 8s ESQL/C 编程指南 南大通用数据技术股份有限公司 - 128 -
EXEC SQL END DECLARE SECTION; ⋮
/* set the interval qualifier for the host variable */ inv1.in_qual = TU_IENCODE(2, TU_DAY, TU_SECOND); ⋮