全部產品
Search
文件中心

PolarDB:日期型

更新時間:Jul 06, 2024

本文介紹了PolarDB PostgreSQL版(相容Oracle)支援的日期類型。

說明 在下面關於日期類型的討論中,假設無論什麼時候建立或修改一張表,配置參數polar_comp_redwood_date都已設定為true
名稱儲存大小描述最小值最大值精度
DATE8 bytes日期和時間。4713 BC5874897 AD1 秒
INTERVAL DAY TO SECOND [(p)]12 bytes帶設定精度的時間段。-178000000 年178000000 年1 微秒/14 位
INTERVAL YEAR TO MONTH12 bytes時間段。-178000000 年178000000 年1 微秒/14 位
TIMESTAMP [(p)]8 bytes日期和時間的時間戳記。4713 BC5874897 AD1 微秒
TIMESTAMP [(p)] WITH TIME ZONE8 bytes帶時區的日期和時間的時間戳記。4713 BC5874897 AD1 微秒
TIME [(p)]8 bytes只用於一日內的時間。00:00:0024:00:001 毫秒/14 位
TIME [(p)] WITH TIME ZONE12 bytes帶時區的只用於一日內的時間。00:00:00+145924:00:00-14591 毫秒/14 位

當關鍵字DATE作為列的資料類型在資料定義語言 (Data Definition Language)(DDL)命令,如CREATE TABLE或者ALTER TABLE命令中出現的時候,在把資料表定義儲存在資料庫時,會自動把它轉換成TIMESTAMP(0)類型。因此在日期中帶有的時間部分也會隨著儲存在列中。

當關鍵字DATE作為變數的資料類型在SPL程式的聲明部分出現,或者作為SPL預存程序或SPL函數中形參的資料類型出現,或者作為一個SPL函數傳回值類型出現的時候,總是被轉換成TIMESTAMP(0)類型,因此它可以處理出現的時間部分值。

我們可以在TIMESTAMP類型的值上指定一個代表精度的值p,用來指定在秒欄位中能夠保留的小數位元。參數p的取值範圍在0到6之間,預設值是6。

當TIMESTAMP值以雙精確度浮點類型值儲存的時候(當前是預設設定),實際精度值的限制可以小於6。在2000-01-01午夜之前或者之後的TIMESTAMP類型值是以秒為單位來儲存的。而從日期為2000-01-01向後的幾年內,毫秒精度是可以實現的,但是隨著日期的延續,精度值就不會這麼準確了。當TIMESTAMP值以8位元組整數(這是一個編譯時間的選項)的形式儲存的時候,對於所有層級的時間值來說,毫秒級的精度都是有效。但是8位元組整數的TIMESTAMP類型值的日期範圍比上面所示的要小些。它的範圍是從公元前4713年到公元294276年。

TIMESTAMP (p) WITH TIME ZONE類似於TIMESTAMP (p),但是它也包括時區。

INTERVAL 類型

INTERVAL值指定了一個時間段。類型INTERVAL的值由描述資料值的欄位組成。下列表中的欄位允許出現在INTERVAL類型中。

欄位名取值
YEAR整數值(正或負)。
MONTH0到11。
DAY整數值(正或負)。
HOUR0到23。
MINUTE0到59。
SECOND0到59.9(p),其中9(p)是分數秒的精度。

這些欄位必須以降序的形式呈現,從YEARS到MONTHS,從DAYS到HOURS,從MINUTES再到SECONDS。

PolarDB支援兩種與Oracle相容的INTERVAL類型。

  • PolarDB支援的第一種變數為INTERVAL DAY TO SECOND [(p)]。這種變數可儲存天、小時、分鐘和秒的時間間隔。
    說明 p用於指定second欄位的精度。
    PolarDB將下面的值解釋為:
    • INTERVAL '1 2:34:5.678' DAY TO SECOND(3)

      1天、2小時、34分鐘、5秒和678/1000秒。

    • INTERVAL '1 23' DAY TO HOUR

      1天和23小時。

    • INTERVAL '2:34' HOUR TO MINUTE

      2小時和34分鐘。

    • INTERVAL '2:34:56.129' HOUR TO SECOND(2)
      2小時、34分鐘、56秒和13/1000秒。
      說明 因為指定了精度,所以小數點後一位的數四捨五入,從而變為13。
  • PolarDB支援的第二種與Oracle相容的變數為INTERVAL YEAR TO MONTH。這種變數可以儲存年和月的時間間隔。
    PolarDB將下面的值解釋為:
    • INTERVAL '12-3' YEAR TO MONTH

      12年和3個月。

    • INTERVAL '45' YEAR

      45年。

    • INTERVAL '300' MONTH

      25年。

日期和時間的輸入

日期和時間輸入值一般格式是ISO 8601 SQL相容格式,Oracle預設的dd-MON-yy格式,以及其他的一些對年月日有明確的區分的格式。然而避免在格式上出現不明確的最好方法是使用函數TO_DATE。

任何日期或者時間輸入值都需要像文本字串那樣用單引號引起來,我們可以使用下面這種SQL標準文法。
type 'value' type
說明
  • type可以是日期類型,也可以是TIMESTAMP類型。
  • value是內容為日期/時間的字串。
  • 日期
    下面列出了一些允許使用的日期輸入格式,所有這些格式的值都等同於1999年1月8號。
    • January 8, 1999
    • 1999-01-08
    • 1999-Jan-08
    • Jan-08-1999
    • 08-Jan-1999
    • 08-Jan-99
    • Jan-08-99
    • 19990108
    • 990108

    我們可以把日期類型值分配給資料類型為DATE或者TIMESTAMP的列或者變數。如果日期類型的值不附帶時間類型值,那麼小時,分鐘和秒數的欄位值都是零。

  • 時間
    在下面的表中顯示了一些日期或者時間截類型值中帶有時間部分的樣本。
    樣本描述
    04:05:06.789ISO 8601
    04:05:06ISO 8601
    04:05ISO 8601
    040506ISO 8601
    04:05 AM與04:05相同,AM不影響數值。
    04:05 PM與16:05相同,輸入小時數必須小於等於12。
    04:05:06.789-8ISO 8601
    04:05:06-08:00ISO 8601
    04:05-08:00ISO 8601
    040506-08ISO 8601
    04:05:06 PST縮寫的時區。
    2003-04-12 04:05:06America/New_York用名稱聲明的時區。
  • 時間截

    一個有效時間戳記類型輸入值是由一個日期和一個時間類型值組成。時間戳記中日期部分能夠根Table 3-3-6 Date Input顯示的樣本進行格式化。時間戳記中的時間部分可以根據顯示的樣本進行格式化。

    下面這個關於時間戳記的樣本,使用了Oracle的預設格式。

    08-JAN-99 04:05:06

    下面這個關於時間戳記的樣本,遵循了ISO8601標準的格式。

    1999-01-08 04:05:06

日期和時間的輸出

日期和時間類型的預設輸出格式既可以是與Oracle相容,被稱為Redwood日期的格式(dd-MON-yy),也可以是根據資料庫程式介面而決定的ISO8601格式(yyyy-mm-dd)。使用JDBC進行SQL互動的程式是以ISO8601格式顯示日期。其他程式例如PSQL以Redwood格式來顯示日期。

在下面的表中顯示了關於Redwood和ISO8601這兩種風格輸出格式的樣本。
格式樣本
Redwood style31-DEC-05 07:37:16
ISO 8601/SQL standard1997-12-17 07:37:16

內部格式

對於所有的日期和時間計算,PolarDB都是使用Julian日期進行的。在每年長度為365.2425天的這個假設基礎上,Julian日期能夠正確的預測和計算從公元前4713年開始之後的任意日期。