摘要: 本文章次要介绍了 GaussDB(DWS) 数据类型中的 DATE 类型在不同数据库模式下且在不同利用场景下的行为表现及比照。
本文分享自华为云社区《GaussDB(DWS) 数据类型之 DATE 类型》,原文作者:小仲。
GaussDB(DWS) 中有三种模式,别离是 Oracle 模式,TD 模式和 MySQL 模式。不同的类型在不同的模式下,也有不同的行为表现。接下来便对 GaussDB(DWS) 中的日期 DATE 类型进行具体介绍。
DATE 类型的取值范畴:
GaussDB(DWS) 在存储 DATE 类型时,不反对年月日全副为零或局部为零的场景,且取值范畴在三种模式下是不同的:
在 Oracle 模式下,DATE 类型的取值范畴是公元前 4713 年 1 月 1 日到公元 294277 年 1 月 1 日。在 MySQL 模式和 TD 模式中,DATE 类型的取值范畴是公元前 4713 年到公元 5874897 年。
用例阐明:
1. 不同模式下 DATE 类型的行为
Oracle 模式
a. DATE 类型的体现
GaussDB(DWS) 中 DATE 类型存储时不带时分秒,因为在 Oracle 模式下的 DATE 类型须要带有时分秒,使得 GaussDB(DWS) 在 Oracle 模式下存在带时分秒的和不带时分秒的两种 DATE 类型,所以为了容易辨别,在显示时不带时分秒的 DATE 类型用列名 date 示意;带时分秒的 DATE 类型用同样带时分秒的 TIMESTAMP 类型的列名 timestamp 示意。
postgres=# select date '4713-01-01 BC';
timestamp
------------------------
4713-01-01 00:00:00 BC
(1 row)
postgres=# select date '294277-01-01';
timestamp
-----------------------
294277-01-01 00:00:00
(1 row)
b. Oracle 模式下失去只含有年月日的 DATE 类型的办法
如果想要在 Oracle 模式下将日期转成只有年月日的 DATE 类型,有办法能够实现么?事实上也是有的。GaussDB(DWS) 提供了两种形式,一种是通过在 Oracle 模式下应用 date 函数:date 函数的参数至多须要蕴含年月日,并将日期中的年月日提取并输入;另一种则是通过 cast 函数进行转换,但转换时应将 date 加上双引号,否则转换后的数据还是会含有时分秒局部。
postgres=# select date('2008-05-24 10:40:21');
date
------------
2008-05-24
(1 row)
postgres=# select cast('2008-05-24 10:40:21.100050' as "date");
date
------------
2008-05-24
(1 row)
postgres=# select cast('2008-05-24 10:40:21.100050' as date);
timestamp
---------------------
2008-05-24 10:40:21
(1 row)
c. DATE 类型操作符
MySQL 模式和 TD 模式:DATE 类型只有年月日。
a. DATE 类型的体现
MySQL 模式与 TD 模式下 DATE 类型无差别。
mysql_db=# select date '5874897-01-01';
date
---------------
5874897-01-01
(1 row)
td_db=# select date '5874897-01-01';
date
---------------
5874897-01-01
(1 row)
b. MySQL 模式与 TD 模式下失去只含有年月日的 DATE 类型的办法
因为在 MySQL 模式或 TD 模式下,DATE 类型只有年月日,故应用 to_date 函数和 date 函数所失去的后果都只有年月日,同时 cast 函数进行类型转换时,date 加不加引号所失去的后果也是统一的。
td_db=# select date('2008-05-24 10:40:21');
date
------------
2008-05-24
(1 row)
td_db=# select cast('2008-05-24 10:40:21.100050' as "date");
date
------------
2008-05-24
(1 row)
td_db=# select cast('2008-05-24 10:40:21.100050' as date);
date
------------
2008-05-24
(1 row)
mysql_db=# select date('2008-05-24 10:40:21');
date
------------
2008-05-24
(1 row)
mysql_db=# select cast('2008-05-24 10:40:21.100050' as "date");
date
------------
2008-05-24
(1 row)
mysql_db=# select cast('2008-05-24 10:40:21.100050' as date);
date
------------
2008-05-24
(1 row)
c. DATE 类型操作符
与 Oracle 模式的差别:当 DATE 类型的值进行相减时返回值不带 day,只有数值。
2. 不同模式下的 DATE 类型相干函数后果的行为:
GaussDB(DWS) 中存在与 DATE 类型相干的函数:
- to_date: 将文本类型的值转换为指定格局的工夫戳,若参数只有一个时,默认格局为 DATE 类型的格局。
- to_char: 将一个 DATE、TIMESTAMP、TIMESTAMP WITH TIME ZONE 或者 TIMESTAMP WITH LOCAL TIME ZONE 类型的 DATETIME 或者 INTERVAL 值依照 fmt 指定的格局转换为 VARCHAR 类型。可选参数 fmt 能够为以下几类:日期、工夫、星期、季度和世纪。每类都能够有不同的模板,模板之间能够正当组合;常见的模板有:HH、MM、SS、YYYY、MM、DD。模板能够有修饰词;罕用的修饰词是 FM,能够用来克制前导的零或尾随的空白。返回值类型:varchar
- current_date: 获取以后日期。
- date_part: 获取给定日期工夫中的指定域值。
- isfinite: 测试给定日期是否为无效日期。
Oracle 模式: 因为 Oracle 模式中的 DATE 类型含有时分秒,故 to_date 和 to_char 函数失去的后果含有时分秒。
TD 模式: 因为 TD 模式下的 DATE 类型只有年月日,故 to_date 函数失去的后果只有年月日。在 TD 模式下,to_char 函数的输入后果能够由 GUC 参数 convert_empty_str_to_null_td 管制,若不设置参数则返回上表中的后果,若设置参数则返回后果与 TD 数据库中的后果保持一致,为 2008/05/24。
MySQL 模式: 因为 MySQL 模式下 DATE 类型只有年月日,故 to_date 函数和 to_char 函数的返回后果只有年月日。
想理解 GuassDB(DWS) 更多信息,欢送微信搜寻“GaussDB DWS”关注微信公众号,和您分享最新最全的 PB 级数仓黑科技,后盾还可获取泛滥学习材料哦~
点击关注,第一工夫理解华为云陈腐技术~