金仓数据库ORA_DATE_STYLE参数设置为ON后,为何表中的DATE类型字段对应的数据依旧无时分秒

关键字:

人大金仓、金仓数据库、KingbaseES、KES、DATE、ORA_DATE、ORA_DATE_STYLE

内容正文:

问题现象:

使用KingbaseES数据库的客户端工具sys_dump时,出现如下所示报错:

1、在ksql终端中使用SQL命令新建t表:create table t(id integer, dat date default now()::text::date not null)

2、在ksql终端中使用SQL命令启用Oracle模式:alter system set ORA_DATE_STYLE=on

3、重启数据库服务,使得Oracle模式生效

4、在ksql终端中验证Oracle模式起效:select now()::text::date,查询显示格式为“YYYY-MM-DD HH24:MI:SS”

5、在ksql终端中执行写表SQL:insert into t values (1)

6、在ksql终端中执行查表SQL:select * from t,查询结果 DATE格式为 “YYYY-MM-DD”,没有时分秒“HH24:MI:SS”

问题原因:

受ORA_DATE_STYLE参数的控制,关键字DATE在PG(缺省)模式下的数据类型表示为“DATE”类型,在Oracle模式下表示为“ORA_DATE”类型。KingbaseES数据库管理系统的表元信息是持久化存储在系统目录“sys_attribute”之中的,一旦创建表成功,列字段的数据类型就已经被确定,不再受ORA_DATE_STYLE参数的控制。

就上诉案例而言,由于新建t表时处于PG模式下,DAT列的类型为DATE类型。后续无论如何调整ORA_DATE_STYLE参数,DAT列的类型依旧为“DATE”类型,不会变成期望的“ORA_DATE”类型。PG模式下“DATE”类型最小精度只支持“日”,Oracle模式下“ORA_DATE”类型最小精度可支持到“时分秒”。上述建表成功后,查看表结构为:

kingbase=# \d t;

 ID   | INTEGER |

 DAT  | DATE    | 非空 默认 ((NOW())::TEXT)::DATE

解决步骤:

如果期望使用带“时分秒”的DATE类型建立数据表,则需要在新建表之前切换至Oracle模式,然后再执行建表的SQL语句。仍然使用上述的语句,只需调整步骤即可解决问题。

1)在ksql终端中使用SQL命令启用Oracle模式:

| kingbase=# alter system set ORA_DATE_STYLE=on;

SET

2) 重启数据库服务,使得Oracle模式生效

3) 在ksql终端中使用SQL命令新建t表:

| kingbase=# create table t(id integer, dat date default now()::text::date not null);

CREATE TABLE

4) 在ksql终端中执行写表SQL:

| kingbase=# insert into t values (1);

INSERT 0 1

5) 在ksql终端中执行查表SQL,得到拥有“时分秒”的DATE类型了:

| kingbase=# select * from t;

ID |         DAT

----+---------------------

1 | 2021-10-25 13:42:47

(1 行记录)

6)在ksql终端中查看t表的结构:

| kingbase=# \d t;

ID   | INTEGER  |

DAT  | ORA_DATE | 非空 默认 ((NOW())::TEXT)::ORA_DATE

至此,出现的问题得以修复。

相关内容可参考官方产品用户文档中的路径:

https://help.kingbase.com.cn

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值