返回首页

gbase数据、南大通用产品文档:GBase8sDatetime 对象类型

更新日期:2024年09月11日

GBase 8s支持的时间类型数据有时间类型,日期类型,时间戳类型。

在C语言中, 使用GCIDateTime对象表示时, 使用子类型区分。


C
(64位系统
)


SQLT类型

GCIDateTime时间
GCI_DTYPE_TIME
datetime hour to second
SQLT_TIME
GCIDateTime日期
GCI_DTYPE_DATE
Datetime year to day
SQLT_DATE

GBase 8s GCI 接口使用指南

南大通用数据技术股份有限公司 10
GCIDateTime时间戳
GCI_DTYPE_TIMES
TAMP
除去以上类型的其他时
间类型, 例如datetime
year to fraction(5) ,
datetime hour to
fraction(4).
SQLT_TIMESTA
MP

GCI接口在使用时间类型做数据库访问操作时,有如下规则:
GCIDateTime 时间, 包含小时(范围 0~23) ,分钟(范围 0~59) ,秒(范围 0~59),
不包含纳秒。
GCIDateTime 日期,包含年(范围-4712~9999),月(范围 0~11),日(范围 1~31)。
GCIDateTime 时间戳,包含年(范围-4712~9999) ,月(范围 0~11), 日(范围
1~31), 小时(范围 0~23),分钟(范围 0~59), 秒(范围 0~59) ,纳秒(
范 围 0~999999999)
关于纳秒, GBase8s中datetime的fraction类型的位数范围是1~5,最大只保留5位有效数字
, 所以纳秒的低4位会被舍弃。例如,对于datetime year to fraction(5)的数据, 输入值为
9999, 存入数据库的值为0。
Datetime对象类型使用举例:

/* 分配用于存储数据的变量*/
GCIDateTime *tstmpltz = (GCIDateTime *)NULL;
/* Col1 是时间戳 */
GCIText *sqlstmt = (GCIText *)"SELECT col1 FROM foo";
/* 分配Datetime对象句柄 */
status = GCIDescriptorAlloc(envhp,(void **)&tstmpltz, GCI_DTYPE_TIMESTAMP,
0, (void **)0);
....
status = GCIStmtPrepare (stmthp, errhp, sqlstmt, (ub4)strlen ((char *)sqlstmt),
(ub4)GCI_NTV_SYNTAX, (ub4)GCI_DEFAULT);
/* 绑定对象句柄,注意是指针的地址*/
status = GCIDefineByPos(stmthp, &defnp, errhp, 1, &tstmpltz, sizeof(tstmpltz),
SQLT_TIMESTAMP_LTZ, 0, 0, 0, GCI_DEFAULT);
/*执行和获取*/
GCIStmtExecute(svchp, stmthp, errhp, 1, 0,(GCISnapshot *) NULL,
(GCISnapshot *)NULL, GCI_DEFAULT)

GBase 8s 支持最常见内置数据类型集。此外,GBase 8s 上还支持扩展数据类型集。
下图显示 GBase
8s 支持的数据类型的逻辑类别。
有阴影的类别表示仅在 GBase
8s 上
受支持的其他数据类型。图 1. 受支持数据类型的概述


对此图作了简化;一些内置类型是作为不透明类型实现的,并且仅在 GBase 8s 上受
支持。即,不透明和内置不是分离的类别,虽然大部分内置数据类型都不是不透明数据类
型。
内置数据类型(系统定义的)和扩展数据类型(您可以定义)都具有下列特征。您可
以:
使用它们来在数据库表中创建列。
将它们声明为自变量和例程的返回类型。
将它们用作从中创建 DISTINCT 数据类型的基本类型。
将它们强制转型为其他数据类型。
用 SPL 和 ESQL/C 声明和存取这些类型的主变量。
有关例外情况,请参阅每种数据类型的描述。要了解概述,请参阅内置数据类型和扩
展数据类型。
可以使用 CREATE TABLE 语句将数据类型指定给列并使用 ALTER TABLE 语句更改数据
类型。当更改现有列数据类型时,如果可能的话,会将所有数据转换为新数据类型。
有关 ALTER TABLE 和 CREATE TABLE 语句、创建特定数据类型及创建和删除强制转型

GBase 8s SQL 指南:参考
南大通用数据技术股份有限公司 - 79 -

的 SQL 语句以及其他数据类型主题的信息,请参阅 GBase 8s SQL 指南:语法。

有关如何创建和使用 GBase 8s 支持的复杂数据类型的信息,请参阅《GBase 8s 数据
库设计和实现指南》。有关如何创建用户定义的数据类型的信息,请参阅 GBase 8s 用户
定义的例程与数据类型开发者指南。
GBase 8s 支持的数据类型
下表列出 GBase 8s 支持的所有内置数据类型。
表 1. GBase 8s 支持的数据类型
数据类型
解释
BIGINT 数据类型
存储 8 个字节的整数值,从 -(263 -1) 到 263 -1
BIGSERIAL 数据类型
存储 8 个字节的顺序整数值,范围是 1 到 263 -1
BYTE 数据类型
存储任何种类的二进制数据,最长 231 个字节
CHAR(n) 数据类型
存储字符串;整理使用代码集顺序
CHARACTER(n) 数据类型
CHAR 的同义词
CHARACTER VARYING(m,r) 数
据类型
存储可变长度字符串(符合 ANSI);以代码集顺序整理
DATE 数据类型
存储日历日期
DATETIME 数据类型
存储日历日期和一天中的时间
DEC 数据类型
DECIMAL 的同义词
DECIMAL
存储精度可定义的浮点数;如果数据库符合 ANSI,那么小数位为零
DECIMAL (p,s) 定点
存储已定义小数位和精度的定点数
DOUBLE PRECISION 数据类型 FLOAT 的同义词
FLOAT(n)
存储相应于 C 中的 double 数据类型的双精度浮点数
INT 数据类型
INTEGER 的同义词
INT8
存储 8 个字节的整数值,从 -(263 -1) 到 263 -1
INTEGER 数据类型
存储从 -2,147,483,647 到 +2,147,483,647 的整数
INTERVAL 数据类型
以年和月为单位存储时间范围(或工作的级别)。
INTERVAL 数据类型
以连续的单位日、小时、分钟、秒和秒的若干分之几存储时间范围
MONEY(p,s) 数据类型
存储货币总额

GBase 8s SQL 指南:参考
南大通用数据技术股份有限公司 - 80 -

NCHAR(n) 数据类型
与 CHAR 相同,但可以支持本地化的整理
NUMERIC(p,s) 数据类型
DECIMAL(p,s) 的同义词
NVARCHAR(m,r) 数据类型
与 VARCHAR 相同,但可以支持本地化整理
REAL 数据类型
SMALLFLOAT 的同义词
SERIAL(n) 数据类型
在 INT 的正数范围内存储连续整数 (> 0)
SERIAL8(n) 数据类型
在 INT8 的正数范围内存储连续整数 (> 0)
SMALLFLOAT
存储对应于 C 语言的 float 数据类型的单精度浮点数
SMALLINT 数据类型
存储从 -32,767 到 +32,767 的整数
TEXT 数据类型
存储任何种类的文本数据,最长 231 个字节
VARCHAR(m,r) 数据类型
存储可变长度字符串(最长 32,765 个字节);以代码集顺序整理

这些内置 SQL 数据类型在所有 GBase 8s SQL 事务中都有效,包括这些类型的数据操
作语言 (DML) 操作:
对本地数据库中对象的操作
对本地服务器实例数据库中对象的跨数据库操作
对两个或多个数据库服务器实例的数据库中对象的跨服务器操作
在跨服务器 MERGE 操作中,源表(而不是目标表)可以位于远程 GBase
8s 服务器的
数据库中。
对于字符数据类型
(CHAR、
CHAR
VARYING、
LVARCHAR、
NCHAR、
NVARCHAR 和 VARCHAR)

数据字符串可以包含数据库语言环境代码集中的字母、
数字、
标点符号、
空格、
区分标记、
连字符和其他可打印符号。对于 UTF-8 和某些东亚语言环境的代码集,在数据字符串内支
持多字节字符。
GBase 8s 支持的其他数据类型
下表列出 GBase 8s 支持的其他数据类型。
表 2. GBase 8s 支持的其他数据类型
数据类型
解释
BLOB 数据类型
以随机存取块的形式存储二进制数据
binary18
存储 18 字节二进制编码的字符串
binaryvar
存储最大长度为 255 个字节的二进制编码的字符串
BOOLEAN 数据类型
存储布尔值 true 和 false
CLOB 数据类型
以随机存取块的形式存储文本数据

GBase 8s SQL 指南:参考
南大通用数据技术股份有限公司 - 81 -

数据类型
解释
DISTINCT 数据类型
以用户定义的类型存储数据,
该类型与它所基于的源类型具有相同
的格式,但该类型的强制转型和函数与源类型的不同
日历
存储 TimeSeries 数据类型的日历
日历模式
存储日历数据类型的日历模式的结构
IDSSECURITYLABEL 数
据类型
存储 LBAC 安全标号对象。
LIST(e) 数据类型
存储元素的按顺序排序的集合,所有元素都具有同一数据类型 e;
允许重复值
lld_locator
存储大对象标识
lld_lob_data
存储智能大对象的位置,并指定对象是否包含二进制或字符数据
LVARCHAR(m) 数据类型
存储可变长度字符串,可多至 32,739 个字节
MULTISET(e) 数据类型
存储值的非排序集合,
所有元素都具有同一数据类型 e;
允许重复

节点 (node)
存储最多 256 个字符的可变长度的整数和小数点组合(用于表示
分层关系)
OPAQUE 数据类型
存储用户定义的数据类型,
其内部结构对于数据库服务器不可存取
ROW 数据类型,已命名
存储命名 ROW 类型
ROW 数据类型,未命名
存储未命名 ROW 类型
SET(e) 数据类型
存储元素的非排序集合,
所有元素都具有同一数据类型 e;
不允许
重复值
ST_LineString
存储一维对象作为定义线性插值路径的点序列
ST_MultiLineString
存储 ST_LineString 数据类型的集合
ST_MultiPoint
存储 ST_Point 数据类型的集合
ST_MultiPolygon
存储 ST_Polygon 数据类型的集合
ST_Point
存储占用坐标空间中单个位置的零维几何
ST_Polygon
存储二维表面,
并且作为定义外部边界环以及 0 或 0 个以上内部
环的点序列存储
TimeSeries
存储行子类型的集合

其他主题中会单独描述 GBase 8s 的这些扩展数据类型。这些数据类型在定义数据类
型的数据库上的本地操作中有效。
跨数据库分布式 SQL 事务中的扩展数据类型
对相同 GBase 8s 实例的其他数据库的分布式操作可访问 BOOLEAN、BLOB、CLOB 和
LVARCHAR 数据类型,这些数据类型是作为内置不透明类型来实现的。如果 UDT 和
DISTINCT 类型显式地强制转型为内置类型,并且如果所有的 UDT、强制转型和 DISTINCT

GBase 8s SQL 指南:参考
南大通用数据技术股份有限公司 - 82 -

类型在所有参与的数据库中都进行了定义,这样的操作还能访问 DISTINCT 类型(它的基
本类型是内置类型)和用户定义类型 (UDT)。

然而,您无法引用跨数据库事务(这些事务访问本地 GBase 8s 实例的多个数据库)
中的以下扩展数据类型:
没有强制转型为内置数据类型的 UDT
没有强制转型为内置数据类型的 DISTINCT 类型
集合数据类型
命名或未命名 ROW 数据类型
跨服务器分布式 SQL 事务中的扩展数据类型
访问其他 GBase
8s 实例数据库的分布式 SQL 事务和函数调用无法返回复杂或智能大
对象数据类型的值,也无法返回大部分单值或内置不透明数据类型。跨服务器 SQL 操作中
只可访问以下数据类型:
任何透明的内置数据类型
BOOLEAN
透明的内置类型的 DISTINCT
BOOLEAN 的 DISTINCT
LVARCHAR 的 DISTINCT
以上所列出的任何 DISTINCT 类型的 DISTINCT
IDSSECURITYLABEL
LVARCHAR
只有 DISTINCT 数据类型显式地强制转型为内置类型,且所有 DISTINCT 类型、其数
据类型层次结构和其强制转型在参与分布式操作的每个数据库中采用相同的定义时,跨服
务器分布式 SQL 事务才可支持 DISTINCT 数据类型。
对于使用上面列表中的数据类型作为
参数或返回数据类型的跨服务器 UDR 中的查询或其他 DML 操作,UDR 在每个参与数据库
中的定义也必须相同。
拥有足够安全凭证的用户可以在对受保护数据的跨服务器和跨数据库操作中,访问存
储安全标号对象的内置 DISTINCT 数据类型 IDSSECURITYLABEL。
如对受保护数据的本地操
作,在数据库服务器在对保护数据安全的安全标号和发出查询的用户的安全凭证进行比较
后,访问安全策略保护的远程表的分布式查询只可以返回 IDSLBACRULES 允许的符合条件
的行。

函数说明
STR_TO_DATE()是DATE_FORMAT()函数的反函数。
它获得字符串str 和一个格式化字符串format。
如果格式字符串包含日期和时间部分,
则STR_TO_DATE()返回一个DATETIME,
否则当只包含日期或时间部分时,返回DATE 或TIME 值。
包含在str 中的日期,
time 或者datetime 值应该按照format 的格式给定。
对于format
可用的详细形式,参考“5.1.5.5.13 DATE_FORMAT(date,FORMAT)”中的表格。
如果str 包含一个非法日期时间或者datetime,STR_TO_DATE()返回NULL。一
个非法值也会报出一个警告。
示例
示例1:format 的值为“%d.%m.%Y %H.%i”。
gbase> SELECT STR_TO_DATE('30.08.2020 09.20', '%d.%m.%Y %H.%i')
FROM dual;
+---------------------------------------------------+
| STR_TO_DATE('30.08.2020 09.20', '%d.%m.%Y %H.%i') |
+---------------------------------------------------+
| 2020-08-30 09:20:00
|
+---------------------------------------------------+
1 row in set
示例2:format 的值为“%Y-%m-%d %H:%i:%s”。
gbase> SELECT STR_TO_DATE('2020-15-08
00:00:00','%Y-%m-%d %H:%i:%s') FROM dual;

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
812
+--------------------------------------------------------+
| STR_TO_DATE('2020-15-08 00:00:00','%Y-%m-%d %H:%i:%s') |
+--------------------------------------------------------+
| NULL
|
+--------------------------------------------------------+
1 row in set, 2 warnings
示例3:format 的值为“%m/%d/%Y”。
gbase> SELECT STR_TO_DATE('08/30/2020', '%m/%d/%Y') FROM dual;
+---------------------------------------+
| STR_TO_DATE('08/30/2020', '%m/%d/%Y') |
+---------------------------------------+
| 2020-08-30
|
+---------------------------------------+
1 row in set
示例4:注意不能使用格式“%X%V”将一个“year-week”字符串转化为一个日
期,原因是当一个星期跨越一个月份界限时,一个年和星期的组合不能标示一个
唯一的年和月份。若要将“year-week”转化为一个日期,则也应指定具体工作日
gbase> SELECT str_to_date('202035 Monday', '%X%V %W') FROM dual;
+-----------------------------------------+
| str_to_date('202035 Monday', '%X%V %W') |
+-----------------------------------------+
| 2020-08-31
|
+-----------------------------------------+
1 row in set