返回首页

gbase数据、南大通用产品文档:GBase8s数据转换函数

更新日期:2024年09月11日

可以在使用表达式的任何地方使用数据转换函数。
下列转换函数在日期与字符串之间转换:

DATE 函数
DATE 函数将字符串转换为 DATE 值。
在以下查询中,
DATE 函数将字符串转换为 DATE
值,
以允许与 DATETIME 值进行比较。
仅当 call_dtime值比指定的 DATE 晚时查询才会检
索 DATETIME 值。
图: 查询
SELECT customer_num, call_dtime, res_dtime
FROM cust_calls
WHERE call_dtime > DATE ('12/31/97');
图: 查询结果
customer_num call_dtime res_dtime

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 94 -

106 1998-06-12 08:20 1998-06-12 08:25
110 1998-07-07 10:24 1998-07-07 10:30
119 1998-07-01 15:00 1998-07-02 08:21
121 1998-07-10 14:05 1998-07-10 14:06
127 1998-07-31 14:30
仅当 call_dtime 大于或等于指定日期时,
下列查询才会将 DATETIME 值转换为 DATE 格
式并带标签显示这些值。
图: 查询
SELECT customer_num,
DATE (call_dtime) called,
DATE (res_dtime) resolved
FROM cust_calls
WHERE call_dtime >= DATE ('1/1/98');
图: 查询结果
customer_num called resolved

106 06/12/1998 06/12/1998
110 07/07/1998 07/07/1998
119 07/01/1998 07/02/1998
121 07/10/1998 07/10/1998
127 07/31/1998

TO_CHAR 函数
TO_CHAR 函数将 DATETIME 或 DATE 值转换为字符串值。
TO_CHAR 函数根据您指定
的日期格式化伪指令对 DATETIME 值进行求值并返回 NVARCHAR 值。
有关受支持的日
期格式化伪指令的列表,请参阅《GBase 8s GLS 用户指南》 GL_DATETIME 环境变量的
描述。
还可以使用 TO_CHAR 函数将 DATETIME 或 DATE 值转换为 LVARCHAR 值。
下列查询使用 TO_CHAR 函数将 DATETIME 值转换为可读性更强的字符串。
图: 查询
SELECT customer_num,
TO_CHAR(call_dtime, "%A %B %d %Y") call_date
FROM cust_calls
WHERE call_code = "B";

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 95 -
图: 查询结果
customer_num 119
call_date Friday July 01 1998
下列查询使用 TO_CHAR 函数将 DATE 值转换为可读性更强的字符串。
图: 查询
SELECT order_num,
TO_CHAR(ship_date,"%A %B %d %Y") date_shipped
FROM orders
WHERE paid_date IS NULL;
图: 查询结果
order_num 1004
date_shipped Monday May 30 1998

order_num 1006
date_shipped

order_num 1007
date_shipped Sunday June 05 1998

order_num 1012
date_shipped Wednesday June 29 1998

order_num 1016
date_shipped Tuesday July 12 1998

order_num 1017
date_shipped Wednesday July 13 1998
TO_CHAR 函数还可以格式化数字值。
有关内置 TO_CHAR 函数的更多信息,
请参阅
《GBase
8s SQL 指南:语法》。

TO_DATE 函数
TO_DATE 函数接受字符数据类型的参数并将此值转换为 DATETIME 值。
TO_DATE 函数
根据您指定的日期格式化伪指令对字符串求值并返回 DATETIME 值。有关受支持的日期
格式化伪指令的列表,请参阅《GBase 8s GLS 用户指南》中 GL_DATETIME 环境变量的
描述。

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 96 -
还可以使用 TO_DATE 函数将 LVARCHAR 值转换为 DATETIME 值。
下列查询使用 TO_DATE 函数将字符串转换为指定格式的 DATETIME 值。
图: 查询
SELECT customer_num, call_descr
FROM cust_calls
WHERE call_dtime = TO_DATE("2008-07-07 10:24",
"%Y-%m-%d %H:%M");

图: 查询结果
customer_num 110

call_descr Order placed one month ago (6/7) not received.
可以使用 DATE 或 TO_DATE 函数来将字符串转换为 DATE 值。
TO_DATE 函数的一个优
点是它允许您为返回的值指定格式。(可以使用 TO_DATE函数(它总是返回 DATETIME
值)来将字符串转换为 DATE 值,原因是数据库服务器隐式处理 DATE 和 DATETIME
值之间的转换。)

连接到SQL 编辑器
可以从“已注册的服务器”连接到SQL 编辑器。在“已注册的服务器”视
图中,右键单击某服务器,在右键菜单中指定“连接”
,然后选择“新建查询”
菜单项将打开 “SQL 编辑器”
,界面焦点将转移到SQL 编辑器。如下图所示:




GBase 8a 管理工具手册
南大通用数据技术股份有限公司

- 19 -
图 3-15



GBase 8a 管理工具手册
南大通用数据技术股份有限公司

- 20 -
4 对象资源管理器
对象资源管理器提供了GBase
8a 服务器中所有数据对象的视图,
并具有可
用于管理这些对象的用户界面。通过它可以管理GBase 8a 的数据对象。
用户可以使用对象资源管理器对GBase
8a 数据库对象进行管理。
与对象资
源管理器建立连接成功,进入对象资源管理器主界面如下图所示:

图 4-1
对象资源管理器的初始化界面如上图所示,数据库中包含系统数据库,系
统数据库中包含information_schema、gbase 两个系统数据库,用户数据库中
包含一个test 数据库,
用户可以在对象资源管理器中建立用户数据库。
安全性
包含用户节点,对用户的权限进行管理。
GBase
8a 主要包含数据库、表、表空间、视图、存储过程、函数这些数据
库对象,下面分别介绍如何利用对象资源管理器管理这些数据库对象。

1.
案例1-关联条件的顺序优化

优化原因
当前版本的GNode 中,LEFT JOIN 的ON 条件中的右表单表条件会在JOIN
之后执行,尤其当LEFT JOIN 的右表是大表时,会导致参与JOIN 的数据量
过大,增加JOIN 耗时。

SQL 特征
LEFT JOIN 语句
ON 条件中包含右表的单表条件

优化场景
LEFT JOIN 的右表是大表
ON 条件中,
右表的单表条件过滤后的数据量占右表总数据量比较少
(约10%
左右)。
注:因为本优化改写是把右表改写为子查询,需要考虑子查询额外的物化消
耗,
因此不是所有此类SQL 改写都能提升性能,
尤其是当查询的投影列中出
现大量右表列时。

优化效果

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
1299
通过改写,把右表单表过滤放在一个独立的子查询中,保证右表的过滤在
JOIN 前执行,达到优化查询性能的目的。
示例语句:
SELECT x1.id2, x2.id2, x2.id3 FROM x1 LEFT JOIN x2 on x1.id2 = x2.id2 AND
x2.id3 = 301;
改写后语句
SELECT x1.id2, x2.id2, x2.id3 FROM x1 LEFT JOIN (SELECT x2.id2, x2.id3
FROM x2 WHERE x2.id3 = 301) x;
2.
案例2-关联条件带有子查询的优化

优化原因
GNode 中,LEFT JOIN 的ON 条件中的相关子查询无法按优化方式执行,需
要按逐行代入方式执行,这导致相关子查询的执行性能极低。

SQL 特征
LEFT JOIN 语句
ON 条件中包含右表的单表条件,且这个单表条件是一个相关子查询

Trace 信息
相关子查询无法按优化方式执行时,GNode 的trace 中会有如下信息:
can't optimize this subselect because OUTER JOIN or "outer select's table is used
in having" or ... !

示例语句
SELECT x1.id2, x2.id2, x2.id3 FROM x1 LEFT JOIN x2 on x1.id2 = x2.id2 AND
EXISTS (SELECT 1 FROM x3 WHERE x3.id3 = x2.id3);
改写后语句
SELECT x1.id2, x.id2, x.id3 FROM x1 LEFT JOIN (SELECT id2, id3 FROM x2
WHERE EXISTS (SELECT 1 FROM x3 WHERE x3.id3 = x2.id3)) x ON x1.id2 =
x.id2;
3.
案例3-通过新增关联条件字段,提高性能
当SQL 语句中用到表内关联的计算时候,
尤其是表的数据量超千万级别的时
候,可以尝试将关联计算创建为一个字段,通过新字段结果进行直接判断。
示例:

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
1300
select


from rep.statcmain a ,rep.statcitemkind b;
where 表关联条件
and a.statdate <= a.endstatdate
and ..
表rep.statcmain 数据量为81864314,当表内关联计算比较a.statdate 与
a.endstatdate 的大小时,耗时长,修改为如下两步进行优化,
首先在rep.statcmain 上创建数值型字段statdate_endstatdate。
令statdate_endstatdate= a.statdate- a.endstatdate。
update
rep.statcmain
set
statdate_endstatdate
=
cast(statdate
as
date)
-
cast(endstatdate as date);
表关联的时候通过statdate_endstatdate 字段过滤数据。
select


from rep.statcmain a ,rep.statcitemkind b,
where 表关联条件
and statdate_endstatdate <= 0
and ..
性能对比:优化前执行1 小时50 分钟,优化后执行45 分钟。