返回首页

gbase数据、南大通用产品文档:GBase8sGCIDateTimeToText

更新日期:2024年09月11日



sword GCIDateTimeToText (
void *hndl,
GCIError *err,
const GCIDateTime *date,
const GCIText *fmt,
ub1 fmt_length,
ub1 fsprec,
const GCIText *lang_name,
size_t lang_length,
ub4 *buf_size,
GCIText *buf
);

将日期时间date按照fmt格式转换成字符串类型。



GBase 8s GCI 接口使用指南

南大通用数据技术股份有限公司 94 参数
输入
/输出


hndl
输入
用户会话句柄或环境句柄,在此函数中不做验证
err
输入
错误信息句柄, 该接口调用失败时, 错误信息会存在该句柄上
date
输入
要转换成字符串的日期时间值
fmt
输入
转换格式, 支持的格式与数据库服务中TO_CHAR和TO_DATE
函数的format_string参数一致, 详见《GBase 8s SQL 指南:语法》
fmt_length
输入
格式串长度
fsprec
输入
指定要保留的小数部分秒的精度
lang_name
输入
兼容保留参数,一般填写NULL
lang_length
输入
兼容保留参数,一般填写0
buf_size
输入/输出
转换前的buf大小(输入)
转换后字符串的长度(输出)
buf
输出
转换后的字符串

如果执行成功, 返回GCI_SUCCESS,否则返回GCI_ERROR。



GBase 8s GCI 接口使用指南

南大通用数据技术股份有限公司 95

函数按照不同的处理逻辑,脱敏规则的获取方式也不相同,大致可分为两类。
1.
控制流函数可以直接返回脱敏列,而非对脱敏列进行比较和计算,这时函数会
将脱敏列的脱敏规则应用到其他返回值。这类函数有case when/decode、if、
ifnull、nvl 和coalesce 函数。举例如下:
select case col when 1 then '123' when 2 then '456' when 3 then mask_col else '789' end from t;
说明
其中col 为非脱敏列,mask_col 为脱敏列,“123”、“456”、“789” 为常量。
上面查询中case when 函数可能的返回值为’123’、’456’、’789’和mask_col,返
回值中包含了脱敏列,这时会对常量’123’、’456’和’789’按照脱敏列mask_col
的脱敏规则进行脱敏。

当这类函数的返回值中有多个脱敏列(不同列)时,该函数将使用默认脱敏规
则(不考虑多列脱敏规则是否完全相同)。
比如:
select nvl(mask_col1, mask_col2) from t;
nvl 函数将使用默认脱敏规则。

select nvl(mask_col1, mask_col1) from t;
nvl 函数仍将使用mask_col1 的脱敏规则。

当这类函数的返回值中既包含脱敏列,同时也包含非脱敏列(不是常量)时,
该函数也将使用默认脱敏规则。
比如:
select coalesce(col, mask_col) from t;
coalesce 函数将使用默认脱敏规则。

当这类函数的返回值中类型不完全相同时,
将会依据数据类型的转换规则进行

GBase 8a MPP Cluster 产品手册
4 管理员指南
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
465
转换,
如果转换后的数据类型与脱敏列的原始类型不一致
(只考虑string、
real、
decimal 和int 四个级别,而不考虑更细的数据类型),则使用默认脱敏。
比如:
select coalesce(mask_int_col, 'abcdef') from t;
coalesce 函数返回值为string,
与mask_int_col 的类型(int)不一致,
所以coalesce
将使用默认脱敏。
默认脱敏时,
并不是将mask_int_col 的值转换为string,
而是直接返回string 类
型的默认脱敏值(xxxx)。
控制流函数类型转换规则:

任何一个参数为string 时,则按string 进行运算;

没有string 时,如果存在real,按real 进行运算;

没有string 和real 时,如果存在decimal,按decimal 进行运算;

日期时间类型算作string 类型。
控制流函数只对所有可能的返回值进行脱敏,对控制逻辑中的其他参数不脱
敏,比如case when 函数中只对then 和else 进行脱敏,对case 和when 分支中
的参数不脱敏。

Union、
Intersect 和Minus 运算时,
对应列的脱敏规则选取与控制流函数的脱敏
规则一致。
比如:
select mask_int_col from t union select mask_int_col as col from t;
将使用mask_int_col 的脱敏规则,而:
select mask_int_col from t union select mask_int_col+1 from t;
将使用默认脱敏。
2.
绝大部分函数是对参数进行比较或者计算,比如一些字符串函数、比较函数、
数值函数、时间和日期函数、OLAP 函数和聚集函数等,这类函数的参数如果
有脱敏列,函数将使用默认脱敏规则对返回值进行脱敏,而非对脱敏列脱敏后
参与运算。
举例如下:
select concat(mask_col, '123') from t;
其中mask_col 为脱敏列,’123’为常量。
上面查询中concat 函数并非将脱敏后的mask_col 字符串连接常量’123’,而是
对concat 返回值进行默认脱敏。
由于concat 返回值是字符类型,
所以上述结果
除mask_col 为NULL 的情况外(NULL 值情况返回值为NULL),始终返

GBase 8a MPP Cluster 产品手册
4 管理员指南
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
466
回’xxxx’。
再比如select mask_col > 1 from t; 将依据函数“>”的返回值类型使用默认脱
敏规则,所以除mask_col 为NULL 值外,始终返回0。
脱敏列脱敏后如果超过脱敏列的最大长度,则自动截断为脱敏列的最大长度。
比如脱敏列定义为:
mask_col varchar(5) masked with (function ='partial(2,"xxxx",2)')
则值“abcde”理论上应脱敏为“abxxxxde”,脱敏后的长度超过了最大长度5,
自动截断为“abxxx”。
同样,对于一些可设置长度的函数脱敏时也会被截断,比如:
select left(mask_col, 2) from t;
left 函数将使用默认脱敏,理论上应脱敏为“xxxx”,但超过了left 函数设置
的最大长度,所以自动截断为“xx”。

27445 (gbased)