時間遠程游查詢語法及時間戳記
查詢語法
具有一個以上時間子句的 SELECT 查詢是時間旅行查詢。 時間遠程作業查詢可能在 INSERT、UPDATE、DELETE、MERGE 或 CREATE TABLE AS SELECT (CTAS) 陳述式中顯示為 sub-SELECTs。
此外,時間遠程作業查詢可能出現在視圖定義 (CREATE VIEW,含或不含 OR REPLACE) 或儲存程序定義 (CREATE PROCEDURE,含或不含 OR REPLACE)。 在任一情況下,不會在視圖或程序定義時評估語法中的時間戳記表示式 (例如 CURRENT_TIMESTAMP - INTERVAL ‘1 day’),但會在使用者或應用程式查詢視圖或呼叫程序時評估。
SELECT 或 sub-SELECT 中的任何基本表格參照 (表格名稱,具有或不具有資料庫及綱目名稱,以及具有或不具有別名) 可能具有選用的時間子句,其包含關鍵字 FOR SYSTEM_TIME,後面接著下列其中一個值:
AS OF <TIMESTAMP EXPRESSION>BEFORE <TIMESTAMP EXPRESSION>BETWEEN <TIMESTAMP EXPRESSION 1> AND <TIMESTAMP EXPRESSION 2>FROM <TIMESTAMP EXPRESSION 1> TO <TIMESTAMP EXPRESSION 2>
每一個 TIMESTAMP EXPRESSION 必須是下列其中一項:
- 文字時間戳記值。 例如,
‘2022-10-31 20:00:00’。 - 值為時間戳記的查詢參數或主變數。
- 傳回或隱含轉換為時間戳記的內建函數。 例如,
CURRENT_DATE、CURRENT_TIMESTAMP或 (相等)NOW(),或CURRENT_TIMESTAMP(subsecond-digits)或 (相等)NOW(subsecond-digits)。 - 針對表格中所有列評估為單一時間戳記的表示式。 例如,
CURRENT_TIMESTAMP - INTERVAL ‘1 day’。 表示式不能參照表格直欄或非唯一性函數 (例如,RANDOM()),也不能是 sub-SELECT。 - 特殊 ID RETENTION_START_TIMESTAMP,在 AS OF、介於和 從 (但不是 之前、AND 或 至) 的特定情況下。 這是指保留開始時間戳記,這是可用於時間遠程作業查詢的最舊可能橫列插入時間戳記或刪除時間戳記。 如需保留開始時間戳記、插入時間戳記及刪除時間戳記的相關資訊,請參閱 時間遠程作業查詢中的時間戳記。
起自
當您想要擷取過去任何特定時間的資料狀態時,可以使用 AS OF 子條款。
| 語法 | 說明 |
|---|---|
| AS OF <TIMESTAMP EXPRESSION 1> | 包括在 TIMESTAMP EXPRESSION 1 評估的時間戳記時有效的所有列,其插入時間戳記小於或等於 TIMESTAMP EXPRESSION 1,以及其刪除時間戳記為 NULL 或大於 TIMESTAMP EXPRESSION 1 的所有列。 如果 TIMESTAMP EXPRESSION 1 小於表格的保留開始時間戳記,則會傳回錯誤。 |
之前
當您想要擷取資料的狀態時,可以使用 before 子條款,因為它正好在過去任何特定時間之前。
| 語法 | 說明 |
|---|---|
| 早於<TIMESTAMP EXPRESSION 1> | 併入在 TIMESTAMP EXPRESSION 1 評估的時間戳記之前有效的所有列。 其插入時間戳記嚴格小於 TIMESTAMP EXPRESSION 1,且其刪除時間戳記是空值或大於 TIMESTAMP EXPRESSION 1。 如果 TIMESTAMP EXPRESSION 1 小於或等於表格的保留開始時間戳記,則會傳回錯誤。 |
從 ...TO 和 Between...AND
您可以使用 FROM...TO 和 之間 ...AND 子條款用於資料審核或趨勢分析。 當您需要在一段時間內取得部分或所有列的所有歷程轉換時,請使用它。
| 語法 | 說明 |
|---|---|
| 從 <時間戳表達式 1> 到 <時間戳表達式 2> | 包括從 TIMESTAMP EXPRESSION 1 到 TIMESTAMP EXPRESSION 2 (不含),且其插入時間戳記嚴格小於 TIMESTAMP EXPRESSION 2 且其刪除時間戳記為 NULL 或大於 TIMESTAMP EXPRESSION 1 的任何時間有效的所有列。 如果 TIMESTAMP EXPRESSION 1 或 TIMESTAMP EXPRESSION 2 小於或等於表格的保留開始時間戳記,則會傳回錯誤。 如果 TIMESTAMP EXPRESSION 1 大於或等於 TIMESTAMP EXPRESSION 2,則查詢不會產生任何列。 |
| 介於 <TIMESTAMP EXPRESSION 1> 與 <TIMESTAMP EXPRESSION 2> 之間 | 包括在 TIMESTAMP EXPRESSION 1 與 TIMESTAMP EXPRESSION 2 (內含) 之間任何時間有效的所有列,其插入時間戳記小於或等於 TIMESTAMP EXPRESSION 2,且其刪除時間戳記為 NULL 或大於 TIMESTAMP EXPRESSION 1。 如果 TIMESTAMP EXPRESSION 1 或 TIMESTAMP EXPRESSION 2 小於表格的保留開始時間戳記,則會傳回錯誤。 如果 TIMESTAMP EXPRESSION 1 大於 TIMESTAMP EXPRESSION 2,則查詢不會產生任何列。 |
時間行程查詢中的時間戳記
保留時間間隔和保留時段
表格的保留時間間隔定義經過其刪除時間戳記的天數,歷程 (已刪除) 列可用於時間遠程作業查詢。 在任何給定時間,保留時段會在現行時間戳記 (日期和時間) 結束,並往回延伸給定的天數。 這是隨著現行系統時間的推移而前進的滑動時間範圍。
保留下限
在大部分情況下,表格的保留下限是將表格定義為時間表格的日期和時間。 這可能是您執行 CREATE TABLE 指令時,或您前次將表格的 DATA_VERSION_RETENTION_TIME 從零變更為非零時。
保留開始時間戳記
在將表格定義為時間時 (定義保留下限時),在保留時段內沒有可用的歷程橫列。 若要擷取回溯歷程列實際可用的概念 (對時間遠程作業查詢可見),會定義表格的保留開始時間戳記。 保留開始時間戳記是下列值中較大的值:
- 保留時段的開始 (現行日期/時間減去保留間隔)。
- 保留下限。
表格的保留開始時間戳記在下列作業中發揮作用:
-
時間行程查詢 (SELECT 和 sub-SELECT)
如果您嘗試對在保留開始時間戳記之前已刪除的歷程列執行查詢,則會傳回錯誤。
如果您想要儘可能往回查詢歷程資料,則可以在時間旅行查詢中使用 RETENTION_START_TIMESTAMP 關鍵字。 如果這樣做,您可以避免嘗試自行計算正確的時間戳記。 透過延伸,如果值變得太舊 (早於保留開始時間戳記),則可避免發生錯誤的風險。
-
GROOM TABLE 在保留開始時間戳記之前刪除的歷程列不再需要時間範圍查詢,可以收回。
列時間戳記和有效性
現行或歷程橫列的插入時間戳記是交易插入已確定的橫列的日期/時間。 插入橫列的不是特定 INSERT、UPDATE 或 MERGE 陳述式執行的時間。
如果在保留開始時間戳記之前確定的列的插入交易,則會將該列視為已在保留開始時間戳記插入。 這通常僅適用於將非時間表格變更為時間表格時的現有橫列。
其交易尚未確定的插入列沒有插入時間戳記。 這一列永遠不會對時間旅行查詢可見。
在時間遠程作業查詢中,您可以使用時間表格的 _SYS_START 虛擬直欄來選取插入時間戳記。
歷程橫列的刪除時間戳記是交易刪除橫列確定的日期/時間。 刪除該列的不是特定 DELETE、UPDATE、MERGE 或 TRUNCATE 陳述式執行的時間。
如果截斷時間表格,則現有表格列可用於時間遠程作業查詢,並在確定截斷交易時視為已刪除。
如果在保留開始時間戳記之前確定刪除 (或截斷) 交易,則會將已刪除列視為在保留開始時間戳記時已刪除。 這通常僅適用於將非時間表格變更為時間表格時的現有已刪除橫列; 此類橫列對針對表格的時間遠程作業查詢不可見。
如果歷程橫列的刪除時間戳記落在表格的保留期間內,則針對表格的時間查詢可能會看到歷程橫列。 如果此條件為 true,則無法從表格中移除歷程列 (具有 GROOM TABLE)。
現行橫列的刪除時間戳記 (未刪除,或標示為刪除但未確定) 是空值。
在時間遠程作業查詢中,您可以使用時間表格的 _SYS_END 虛擬直欄來選取刪除時間戳記。
從其插入時間戳記到刪除時間戳記之前,歷程橫列被視為有效。 現行橫列從其插入時間戳記往前視為有效。 時間行程查詢會使用時間戳記或時間戳記表示式,只傳回在某個時間點或某個時段內任何時間點有效的列 (現行或歷程)。
在插入及刪除交易確定之後很短時間 (通常在 3 分鐘以下) 之前,最近插入及刪除列的插入及刪除時間戳記可能無法用於時間遠程作業查詢。