• 不同数据库模式下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级数仓黑科技,后台还可获取众多学习资料哦~

    点击关注,第一时间了解华为云新鲜技术~

  • 相关阅读:
    decode函数
    下载
    sed命令
    JAVA中常用IO流类:FileInputStream和FileOutputStream
    /etc/sysconfig/i18n文件详解
    myeclipse注册方法
    Python标准库os的使用方法
    Python三方库PyAutoGUI的使用方法
    php获取文件创建时间、修改时间
    PHP获取今天、昨天、明天的日期
  • 原文地址:https://www.cnblogs.com/huaweiyun/p/14814315.html
Copyright © 2020-2023  润新知