乐趣区

关于date:不同数据库模式下DATE类型的行为解析

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

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

退出移动版