摘要:本文章次要介绍了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级数仓黑科技,后盾还可获取泛滥学习材料哦~

点击关注,第一工夫理解华为云陈腐技术~