Flink (十七) :Table API SQL (五) 時區

Flink 為日期和時間提供了豐富的數據類型, 包括?DATE,?TIME,?TIMESTAMP,?TIMESTAMP_LTZ,?INTERVAL YEAR TO MONTH,?INTERVAL DAY TO SECOND?。 Flink 支持在 session (會話)級別設置時區。 Flink 對多種時間類型和時區的支持使得跨時區的數據處理變得非常容易。

1. TIMESTAMP vs TIMESTAMP_LTZ

1.1 TIMESTAMP 類型

  • TIMESTAMP(p)?是?TIMESTAMP(p) WITHOUT TIME ZONE?的簡寫, 精度?p?支持的范圍是0-9, 默認是6。
  • TIMESTAMP?用于描述年, 月, 日, 小時, 分鐘, 秒 和 小數秒對應的時間戳。
  • TIMESTAMP?可以通過一個字符串來指定,例如:
Flink SQL> SELECT TIMESTAMP '1970-01-01 00:00:04.001';
+-------------------------+
| 1970-01-01 00:00:04.001 |
+-------------------------+

1.2 TIMESTAMP_LTZ 類型

  • TIMESTAMP_LTZ(p)?是?TIMESTAMP(p) WITH LOCAL TIME ZONE?的簡寫, 精度?p?支持的范圍是0-9, 默認是6。
  • TIMESTAMP_LTZ?用于描述時間線上的絕對時間點, 使用 long 保存從 epoch 至今的毫秒數, 使用int保存毫秒中的納秒數。 epoch 時間是從 java 的標準 epoch 時間?1970-01-01T00:00:00Z?開始計算。 在計算和可視化時, 每個?TIMESTAMP_LTZ?類型的數據都是使用的 session (會話)中配置的時區。
  • TIMESTAMP_LTZ?沒有字符串表達形式因此無法通過字符串來指定, 可以通過一個 long 類型的 epoch 時間來轉化(例如: 通過 Java 來產生一個 long 類型的 epoch 時間?System.currentTimeMillis())
Flink SQL> CREATE VIEW T1 AS SELECT TO_TIMESTAMP_LTZ(4001, 3);
Flink SQL> SET 'table.local-time-zone' = 'UTC';
Flink SQL> SELECT * FROM T1;
+---------------------------+
| TO_TIMESTAMP_LTZ(4001, 3) |
+---------------------------+
|   1970-01-01 00:00:04.001 |
+---------------------------+Flink SQL> SET 'table.local-time-zone' = 'Asia/Shanghai';
Flink SQL> SELECT * FROM T1;
+---------------------------+
| TO_TIMESTAMP_LTZ(4001, 3) |
+---------------------------+
|   1970-01-01 08:00:04.001 |
+---------------------------+
  • TIMESTAMP_LTZ?可以用于跨時區的計算,因為它是一個基于 epoch 的絕對時間點(比如上例中的?4001?毫秒)代表的就是不同時區的同一個絕對時間點。 補充一個背景知識:在同一個時間點, 全世界所有的機器上執行?System.currentTimeMillis()?都會返回同樣的值。 (比如上例中的?4001?milliseconds), 這就是絕對時間的定義。

2. 時區的作用

本地時區定義了當前 session(會話)所在的時區, 你可以在 Sql client 或者應用程序中配置。

-- 設置為 UTC 時區
Flink SQL> SET 'table.local-time-zone' = 'UTC';-- 設置為上海時區
Flink SQL> SET 'table.local-time-zone' = 'Asia/Shanghai';-- 設置為Los_Angeles時區
Flink SQL> SET 'table.local-time-zone' = 'America/Los_Angeles';

session(會話)的時區設置在 Flink SQL 中非常有用, 它的主要用法如下:

2.1 確定時間函數的返回值

session (會話)中配置的時區會對以下函數生效。

  • LOCALTIME
  • LOCALTIMESTAMP
  • CURRENT_DATE
  • CURRENT_TIME
  • CURRENT_TIMESTAMP
  • CURRENT_ROW_TIMESTAMP()
  • NOW()
  • PROCTIME()
Flink SQL> SET 'sql-client.execution.result-mode' = 'tableau';
Flink SQL> CREATE VIEW MyView1 AS SELECT LOCALTIME, LOCALTIMESTAMP, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_ROW_TIMESTAMP(), NOW(), PROCTIME();
Flink SQL> DESC MyView1;
+------------------------+-----------------------------+-------+-----+--------+-----------+
|                   name |                        type |  null | key | extras | watermark |
+------------------------+-----------------------------+-------+-----+--------+-----------+
|              LOCALTIME |                     TIME(0) | false |     |        |           |
|         LOCALTIMESTAMP |                TIMESTAMP(3) | false |     |        |           |
|           CURRENT_DATE |                        DATE | false |     |        |           |
|           CURRENT_TIME |                     TIME(0) | false |     |        |           |
|      CURRENT_TIMESTAMP |            TIMESTAMP_LTZ(3) | false |     |        |           |
|CURRENT_ROW_TIMESTAMP() |            TIMESTAMP_LTZ(3) | false |     |        |           |
|                  NOW() |            TIMESTAMP_LTZ(3) | false |     |        |           |
|             PROCTIME() | TIMESTAMP_LTZ(3) *PROCTIME* | false |     |        |           |
+------------------------+-----------------------------+-------+-----+--------+-----------+
Flink SQL> SET 'table.local-time-zone' = 'UTC';
Flink SQL> SELECT * FROM MyView1;
+-----------+-------------------------+--------------+--------------+-------------------------+-------------------------+-------------------------+-------------------------+
| LOCALTIME |          LOCALTIMESTAMP | CURRENT_DATE | CURRENT_TIME |       CURRENT_TIMESTAMP | CURRENT_ROW_TIMESTAMP() |                   NOW() |              PROCTIME() |
+-----------+-------------------------+--------------+--------------+-------------------------+-------------------------+-------------------------+-------------------------+
|  15:18:36 | 2021-04-15 15:18:36.384 |   2021-04-15 |     15:18:36 | 2021-04-15 15:18:36.384 | 2021-04-15 15:18:36.384 | 2021-04-15 15:18:36.384 | 2021-04-15 15:18:36.384 |
+-----------+-------------------------+--------------+--------------+-------------------------+-------------------------+-------------------------+-------------------------+
Flink SQL> SET 'table.local-time-zone' = 'Asia/Shanghai';
Flink SQL> SELECT * FROM MyView1;
+-----------+-------------------------+--------------+--------------+-------------------------+-------------------------+-------------------------+-------------------------+
| LOCALTIME |          LOCALTIMESTAMP | CURRENT_DATE | CURRENT_TIME |       CURRENT_TIMESTAMP | CURRENT_ROW_TIMESTAMP() |                   NOW() |              PROCTIME() |
+-----------+-------------------------+--------------+--------------+-------------------------+-------------------------+-------------------------+-------------------------+
|  23:18:36 | 2021-04-15 23:18:36.384 |   2021-04-15 |     23:18:36 | 2021-04-15 23:18:36.384 | 2021-04-15 23:18:36.384 | 2021-04-15 23:18:36.384 | 2021-04-15 23:18:36.384 |
+-----------+-------------------------+--------------+--------------+-------------------------+-------------------------+-------------------------+-------------------------+

2.2 TIMESTAMP_LTZ?字符串表示

當一個?TIMESTAMP_LTZ?值轉為 string 格式時, session 中配置的時區會生效。 例如打印這個值,將類型強制轉化為?STRING?類型, 將類型強制轉換為?TIMESTAMP?,將?TIMESTAMP?的值轉化為?TIMESTAMP_LTZ?類型:

Flink SQL> CREATE VIEW MyView2 AS SELECT TO_TIMESTAMP_LTZ(4001, 3) AS ltz, TIMESTAMP '1970-01-01 00:00:01.001'  AS ntz;
Flink SQL> DESC MyView2;
+------+------------------+-------+-----+--------+-----------+
| name |             type |  null | key | extras | watermark |
+------+------------------+-------+-----+--------+-----------+
|  ltz | TIMESTAMP_LTZ(3) |  true |     |        |           |
|  ntz |     TIMESTAMP(3) | false |     |        |           |
+------+------------------+-------+-----+--------+-----------+
Flink SQL> SET 'table.local-time-zone' = 'UTC';
Flink SQL> SELECT * FROM MyView2;
+-------------------------+-------------------------+
|                     ltz |                     ntz |
+-------------------------+-------------------------+
| 1970-01-01 00:00:04.001 | 1970-01-01 00:00:01.001 |
+-------------------------+-------------------------+
Flink SQL> SET 'table.local-time-zone' = 'Asia/Shanghai';
Flink SQL> SELECT * FROM MyView2;
+-------------------------+-------------------------+
|                     ltz |                     ntz |
+-------------------------+-------------------------+
| 1970-01-01 08:00:04.001 | 1970-01-01 00:00:01.001 |
+-------------------------+-------------------------+
Flink SQL> CREATE VIEW MyView3 AS SELECT ltz, CAST(ltz AS TIMESTAMP(3)), CAST(ltz AS STRING), ntz, CAST(ntz AS TIMESTAMP_LTZ(3)) FROM MyView2;
Flink SQL> DESC MyView3;
+-------------------------------+------------------+-------+-----+--------+-----------+
|                          name |             type |  null | key | extras | watermark |
+-------------------------------+------------------+-------+-----+--------+-----------+
|                           ltz | TIMESTAMP_LTZ(3) |  true |     |        |           |
|     CAST(ltz AS TIMESTAMP(3)) |     TIMESTAMP(3) |  true |     |        |           |
|           CAST(ltz AS STRING) |           STRING |  true |     |        |           |
|                           ntz |     TIMESTAMP(3) | false |     |        |           |
| CAST(ntz AS TIMESTAMP_LTZ(3)) | TIMESTAMP_LTZ(3) | false |     |        |           |
+-------------------------------+------------------+-------+-----+--------+-----------+
Flink SQL> SELECT * FROM MyView3;
+-------------------------+---------------------------+-------------------------+-------------------------+-------------------------------+
|                     ltz | CAST(ltz AS TIMESTAMP(3)) |     CAST(ltz AS STRING) |                     ntz | CAST(ntz AS TIMESTAMP_LTZ(3)) |
+-------------------------+---------------------------+-------------------------+-------------------------+-------------------------------+
| 1970-01-01 08:00:04.001 |   1970-01-01 08:00:04.001 | 1970-01-01 08:00:04.001 | 1970-01-01 00:00:01.001 |       1970-01-01 00:00:01.001 |
+-------------------------+---------------------------+-------------------------+-------------------------+-------------------------------+

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/895127.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/895127.shtml
英文地址,請注明出處:http://en.pswp.cn/news/895127.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【真一鍵部署腳本】——一鍵部署deepseek

目錄 deepseek一鍵部署腳本說明 0 必要前提 1 使用方法 1.1 使用默認安裝配置 1.1 .1 使用其它ds模型 1.2 使用自定義安裝 2 附錄:deepseek模型手動下載 3 腳本下載地址 deepseek一鍵部署腳本說明 0 必要前提 linux環境 python>3.10 1 使用方法 1.1 …

5.2Internet及其作用

5.2.1Internet概述 Internet稱為互聯網,又稱英特網,始于1969年的美國ARPANET(阿帕網),是全球性的網絡。 互連網指的是兩個或多個不同類型的網絡通過路由器等網絡設備連接起來,形成一個更大的網絡結構。互連…

“圖像識別分割算法:解鎖視覺智能的關鍵技術

嘿,各位朋友!今天咱們來聊聊圖像識別分割算法。這可是計算機視覺領域里特別厲害的一項技術,簡單來說,它能讓機器“看懂”圖像中的不同部分,并把它們精準地分出來。想象一下,機器不僅能識別出圖里有貓還是狗…

AJAX項目——數據管理平臺

黑馬程序員視頻地址: 黑馬程序員——數據管理平臺 前言 功能: 1.登錄和權限判斷 2.查看文章內容列表(篩選,分頁) 3.編輯文章(數據回顯) 4.刪除文章 5.發布文章(圖片上傳&#xff0…

html轉PDF文件最完美的方案(wkhtmltopdf)

目錄 需求 一、方案調研 二、wkhtmltopdf使用 如何使用 文檔簡要說明 三、后端服務 四、前端服務 往期回顧 需求 最近在做報表類的統計項目,其中有很多指標需要匯總,網頁內容有大量的echart圖表,做成一個網頁去瀏覽,同時…

示例:JAVA調用deepseek

近日,國產AI DeepSeek在中國、美國的科技圈受到廣泛關注,甚至被認為是大模型行業的最大“黑馬”。在外網,DeepSeek被不少人稱為“神秘的東方力量”。1月27日,DeepSeek應用登頂蘋果美國地區應用商店免費APP下載排行榜,在…

.NET周刊【2月第1期 2025-02-02】

國內文章 dotnet 9 已知問題 默認開啟 CET 導致進程崩潰 https://www.cnblogs.com/lindexi/p/18700406 本文記錄 dotnet 9 的一個已知且當前已修問題。默認開啟 CET 導致一些模塊執行時觸發崩潰。 dotnet 使用 ColorCode 做代碼著色器 https://www.cnblogs.com/lindexi/p/…

AES200物理機部署DeepSeek-R1蒸餾模型

AES200物理機部署DeepSeek-R1模型 華為官方官宣自己的NPU支持DeepSeek-R1模型部署,華為的大模型推理部署依托于其大模型推理引擎:MindIE,但是根據MindIE的文檔,其只支持以下硬件: 表1 MindIE支持的硬件列表 類型配置…

【后端開發】系統設計101——Devops,Git與CICD,云服務與云原生,Linux,安全性,案例研究(30張圖詳解)

【后端開發】系統設計101——Devops,Git與CICD,云服務與云原生,Linux,安全性,案例研究(30張圖詳解) 文章目錄 1、DevopsDevOps與SRE與平臺工程的區別是什么?什么是k8s(Ku…

正泰中間電磁繼電器【8腳10A】DC24V 待機功率

需求:繼電器能耗測試。 1.連接24V2A的電源, 2. 穩定功率為 1.4W 3. 正泰中間電磁繼電器【8腳10A】直流DC24V 注:聯通時電磁繼電器會輕微發熱 4.電磁繼電器的工作原理基于電流的磁效應 電磁激勵:電磁繼電器主要由線圈、鐵芯、銜…

計算機視覺核心任務

1. 計算機視頻重要分類 計算機視覺的重要任務可以大致分為以下幾類: 1. 圖像分類(Image Classification) 識別圖像屬于哪個類別,例如貓、狗、汽車等。 應用場景:物品識別、人臉識別、醫療影像分類。代表模型&#…

責任鏈模式(Chain Responsibility)

一、定義:屬于行為型設計模式,包含傳遞的數據、創建處理的抽象和實現、創建鏈條、將數據傳遞給頂端節點; 二、UML圖 三、實現 1、需要傳遞處理的數據類 import java.util.Date;/*** 需要處理的數據信息*/ public class RequestData {priva…

MFC 基礎

windows桌面應用分為兩種類型: 基于文檔視圖類型 和 基于對話框類型。 通常具有復雜交互控件的程序即為基于對話框類型,相對而言比較復雜,而基于文檔視圖類的應用交互形式比較單一,相對簡單。下面給出基于mfc框架的最基本的桌面程…

npm無法加載文件 因為此系統禁止運行腳本

安裝nodejs后遇到問題: 在項目里【node -v】可以打印出來,【npm -v】打印不出來,顯示npm無法加載文件 因為此系統禁止運行腳本。 但是在winr,cmd里【node -v】,【npm -v】都也可打印出來。 解決方法: cmd里可以打印出…

JVM春招快速學習指南

1.說在前面 在Java相關崗位的春/秋招面試過程中,JVM的學習是必不可少的。本文主要是通過《深入理解Java虛擬機》第三版來介紹JVM的學習路線和方法,并對沒有過JVM基礎的給出閱讀和學習建議,盡可能更加快速高效的進行JVM的學習與秋招面試的備戰…

DeepSeek API 調用 - Spring Boot 實現

DeepSeek API 調用 - Spring Boot 實現 1. 項目依賴 在 pom.xml 中添加以下依賴&#xff1a; <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></depe…

認識Electron 開啟新的探索世界一

一、Electron輕松入門 1.搭建開發環境&#xff1a; 一般情況下開發者會使用node.js來創建electron項目&#xff0c;node.js是一個基于Chrome V8引擎的javascript運行環境&#xff0c;所以首先需要到官網去下載安裝node.js 下載鏈接&#xff1a;https://nodejs.org/enhttps://no…

MySQL下載過程

MySQL Enterprise Edition Downloads | Oracle mysql官方下載網址&#xff08;9.2版本&#xff09; 下面的示例是5.7的包&#xff0c;過程是一樣的 port&#xff1a;3308&#xff08;默認的是3306&#xff0c;筆者下了一個占用了該端口&#xff09; root&#xff1a;123456 問題…

【學術投稿】第五屆計算機網絡安全與軟件工程(CNSSE 2025)

重要信息 官網&#xff1a;www.cnsse.org 時間&#xff1a;2025年2月21-23日 地點&#xff1a;中國-青島 簡介 第五屆計算機網絡安全與軟件工程&#xff08;CNSSE 2025&#xff09;將于2025年2月21-23日在中國-青島舉行。CNSSE 2025專注于計算機網絡安全、軟件工程、信號處…

Qt:QWidget核心屬性

目錄 QWidget核心屬性 enab geometry WindowFrame的影響 windowTitle windowIcon qrc文件管理資源 windowOpacity cursor font toolTip focusPolicy styleSheet QWidget核心屬性 在Qt中使用QWidget類表示"控件"&#xff0c;如按鈕、視圖、輸入框、滾動…