GaussDB(DWS)数据类型之DATE类型

举报
小仲 发表于 2021/05/14 20:17:02 2021/05/14
【摘要】 本文章主要介绍了GaussDB(DWS)数据类型中的DATE类型在不同数据库模式下且在不同应用场景下的行为表现及对比。

       GaussDB(DWS)中有三种模式,分别是Oracle模式,TD模式和MySQL模式。不同的类型在不同的模式下,也有不同的行为表现。接下来便对GaussDB(DWS)中的日期DATE类型进行详细介绍。

    DATE类型的取值范围:

    GaussDB(DWS)在存储DATE类型时,不支持年月日全部为零或部分为零的场景,且取值范围在三种模式下是不同的:

    在Oracle模式下,DATE类型的取值范围是公元前4713年1月1日到公元294277年11日。在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类型操作符

    操作符 实例 结果
    + select date ‘2020-08-13’ + interval ‘7’; 2020-08-20 00:00:00
    select date '2020-08-13' + time '12:11:13'; 2020-08-13 12:11:13
    -

    select date '2001-10-01' - date '2001-09-28';

    3 days

    select date '2001-10-01' - interval '5' month;

    2001-05-01 00:00:00

    select date '2001-10-01' - time '12:11:13';

    2001-09-30 11:48:47

    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类型操作符

    操作符 实例 结果
    +

    select date ‘2020-08-13’ + interval ‘7’;

    2020-08-20 00:00:00

    select date '2020-08-13' + time '12:11:13';

    2020-08-13 12:11:13

    -

    select date '2001-10-01' - date '2001-09-28';

    3

    select date '2001-10-01' - interval '5' month;

    2001-05-01 00:00:00

    select date '2001-10-01' - time '12:11:13';

    2001-09-30 11:48:47

    与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:测试给定日期是否为有效日期。
    函数 实例 GaussDB(Oracle) GaussDB(TD) GaussDB(MySQL)

    to_date

    select to_date(date '2008-05-24 10:40:21');

    2008-05-24 10:40:21

    2008-05-24

    2008-05-24

    to_char

    select to_char(date '2008-05-24 10:40:21');

    2008-05-24 10:40:21

    2008-05-24 00:00:00+08

    2008-05-24

    current_date

    select current_date;

    2021-04-25

    2021-04-25

    2021-04-25

    date_part

    select date_part('week', date '2008-05-24');

    21

    21

    21

    isfinite

    select isfinite(date '2008-05-24');

    t

    t

    t

    Oracle模式:由于Oracle模式中的DATE类型含有时分秒,故to_dateto_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级数仓黑科技,后台还可获取众多学习资料哦~

    【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
    • 点赞
    • 收藏
    • 关注作者

    评论(0

    0/1000
    抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。