天天看點

不同資料庫模式下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類型操作符

不同資料庫模式下DATE類型的行為解析

MySQL模式和TD模式: 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類型操作符

不同資料庫模式下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:測試給定日期是否為有效日期。
不同資料庫模式下DATE類型的行為解析

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級數倉黑科技,背景還可擷取衆多學習資料哦~

點選關注,第一時間了解華為雲新鮮技術~