Lindorm時間函數可以實現指定類型的資料與TIMESTAMP時間戳記之間的相互轉換,並支援計算兩個時間戳記之間相差的天數。本文介紹Lindorm支援的時間函數及其使用方法。
引擎與版本
要求Lindorm SQL為2.8.7.0及以上版本。如何查看Lindorm SQL的版本,請參見SQL版本說明。
函數列表
Lindorm支援的時間函數如下表所示。
函數 | 說明 |
將TIMESTAMP類型的時間戳記基於當前會話時區進行格式化輸出。 | |
將Number類型(例如BIGINT、INTEGER、SMALLINT、TINYINT等數實值型別)轉換成當前會話時區的TIMESTAMP時間戳記,如果存在兩個參數,則按照第二個參數進行格式化輸出。 | |
計算兩個TIMESTAMP類型的時間戳記在當前會話時區下日期相隔的天數。 | |
將TIMESTAMP或者時間戳記字串轉換成Epoch時間戳記(單位:秒)。 |
DATE_FORMAT
將TIMESTAMP類型的資料基於當前會話時區進行格式化輸出。如何查看或設定會話時區,請參見如何設定串連時區。
文法
DATE_FORMAT(TIMESTAMP ts, STRING format)參數說明
參數 | 是否必填 | 說明 |
ts | 是 | 待格式化輸出的時間戳記。 |
format | 是 | 格式說明符,具體格式為 |
支援的格式說明符、使用格式說明符後輸出的內容及其詳細介紹如下表所示:
格式說明符 | 輸出 | 輸出說明 |
%a | Sun~Sat | 星期,英文縮寫。 |
%b | Jan~Dec | 月份,英文縮寫。 |
%c | 0~12 | 月份,數值。 |
%D | 1st、2nd、3rd…… | 該月的第幾天,帶英文序數尾碼。 |
%d | 00~31 | 該月的第幾天,兩位元的數值。 |
%e | 00~31 | 該月的第幾天,數值。 |
%f | 000000~999999 | 微秒。 |
%H | 00~23 | 時間的時鐘,兩位元的數值,24小時制。 |
%h | 01~12 | 時間的時鐘,兩位元的數值,12小時制。 |
%I | 01~12 | 時間的時鐘,兩位元的數值,12小時制。 |
%i | 00~59 | 時間的分鐘,兩位元的數值。 |
%j | 001~366 | 該年的第幾天,三位元的數值。 |
%k | 0~23 | 時間的時鐘,數值,24小時制。 |
%l | 1~12 | 時間的時鐘,數值,12小時制。 |
%M | January~December | 月份,英文全稱。 |
%m | 01~12 | 月份,兩位元的數值。 |
%p | AM、PM | 上午或者下午。 |
%r | hh:mm:ss AM/PM | 時間的時分秒(hh:mm:ss),12小時制,帶上午(AM)或下午(PM)資訊。 |
%S | 00~59 | 時間的秒數,兩位元的數值。 |
%s | 00~59 | 時間的秒數,兩位元的數值。 |
%T | hh:mm:ss | 時間的時分秒(hh:mm:ss),24小時制。 |
%W | Sunday~Saturday | 星期,英文全稱。 |
%w | 0~6 | 該星期的第幾天,數值。 |
%Y | 四位元的數值。 | 年份,四位元的數值。例如 |
%y | 兩位元的數值,取年份的後兩位。 | 年份,兩位元的數值,取年份的後兩位,例如 |
%% | % | 輸出一個%字元。 |
%x | x | 輸出x,x為保留英文字母以外的字元。例如: |
不設定格式符時,輸入任一字元,則所有不是以%開頭的字元都將按照原格式輸出。
樣本
將當前時區的時間戳記2024-01-01 17:20:35列印為at 17:20:35 on Jan 1st, 2024。
SELECT DATE_FORMAT('2024-01-01 17:20:35', 'at %T on %b %D, %Y');返回結果:
+------------------------------+
| EXPR$0 |
+------------------------------+
| at 17:20:35 on JAN 1st, 2024 |
+------------------------------+返回結果是該時間戳記在當前會話時區下,按照格式說明符列印出來的字串。
FROM_UNIXTIME
將Number類型(例如BIGINT、INTEGER、SMALLINT、TINYINT等數實值型別)轉換成當前會話時區的TIMESTAMP時間戳記,如果存在兩個參數,則按照第二個參數進行格式化輸出。
Number類型的單位為秒(s),最多保留3位有效數字。
文法
轉換成當前會話時區的TIMESTAMP。
FROM_UNIXTIME (Number seconds)先轉換成當前會話時區的TIMESTAMP,再格式化輸出。
FROM_UNIXTIME (Number seconds, STRING format)
參數說明
參數 | 是否必填 | 說明 |
seconds | 是 | epoch時間戳記,單位為秒(s),最多保留3位小數。 seconds參數的值不考慮時區設定,僅表示GMT時區下自 |
format | 否 | 格式說明符,詳情請參見支援的格式說明符。 |
樣本
樣本一:
將epoch時間戳記
10.1578轉換成當前時區的TIMESTAMP。SELECT FROM_UNIXTIME(10.1578);返回結果:
+-------------------------+ | EXPR$0 | +-------------------------+ | 1970-01-01 08:00:10.158 | +-------------------------+會話時區修改為
+03:00後,將epoch時間戳記10.1578轉換成新時區的TIMESTAMP時間戳記。-- 修改會話時區為+03:00 SET @@time_zone='+03:00'; -- 轉換為新時區的TIMESTAMP SELECT FROM_UNIXTIME(10.1578);說明僅MySQL協議支援修改串連時區。MySQL協議串連方式,請參見使用MySQL協議(推薦)和通過MySQL命令列串連並使用寬表引擎。
返回結果:
+-------------------------+ | EXPR$0 | +-------------------------+ | 1970-01-01 03:00:10.158 | +-------------------------+
樣本二:
將epoch時間戳記
10.1578轉換成當前時區的TIMESTAMP,並按照指定格式輸出。SELECT FROM_UNIXTIME(10.1578, 'at %T on %b %D, %Y');返回結果:
+------------------------------+ | EXPR$0 | +------------------------------+ | at 08:00:10 on JAN 1st, 1970 | +------------------------------+會話時區修改為
+03:00後,將epoch時間戳記10.1578轉換成新時區的TIMESTAMP,並按照指定格式輸出。-- 修改會話時區為+03:00 SET @@time_zone='+03:00'; -- 轉換為新時區的TIMESTAMP SELECT FROM_UNIXTIME(10.1578, 'at %T on %b %D, %Y');返回結果:
+------------------------------+ | EXPR$0 | +------------------------------+ | at 03:00:10 on JAN 1st, 1970 | +------------------------------+
DATEDIFF
計算兩個TIMESTAMP類型的時間戳記,在當前會話時區下日期相隔的天數。
計算方式:用前者減去後者
若結果為正數,則第一個時間戳記表示的日期更晚。
若結果為負數,則第一個時間戳記表示的日期更早。
若結果為
0,表示兩個時間戳記的日期是同一天。
系統會自動忽略時分秒資訊,僅比較日期。
文法
DATEDIFF(TIMESTAMP ts1, TIMESTAMP ts2)參數說明
參數 | 是否必填 | 說明 |
ts1 | 是 | 第一個時間戳記。 |
ts2 | 是 | 第二個時間戳記。 |
樣本
樣本一:
SELECT DATEDIFF('2024-01-01 15:30:00', '2024-01-02 00:59:59');返回結果
+--------+ | EXPR$0 | +--------+ | -1 | +--------+樣本二:
SELECT DATEDIFF('2024-01-05 15:30:00', '2024-01-02 00:59:59');返回結果
+--------+ | EXPR$0 | +--------+ | 3 | +--------+樣本三:
SELECT DATEDIFF('2024-01-02 15:30:00', '2024-01-02 00:59:59');返回結果
+--------+ | EXPR$0 | +--------+ | 0 | +--------+
UNIX_TIMESTAMP
將TIMESTAMP類型或時間戳記字串轉換成Epoch時間戳記(單位:秒),並返回DOUBLE類型。
當參數類型是TIMESTAMP類型時,傳回值最多隻有3位小數;當參數是時間戳記字串時,會被當成當前會話時區的時間來進行轉換,傳回值最多有6位小數。
文法
UNIX_TIMESTAMP (ts)參數說明
參數 | 是否必填 | 說明 |
ts | 是 | 僅支援TIMESTAMP和VARCHAR類型,表示當前會話時區的時間戳記。 |
樣本
假設樣本表t1的結構與表中資料如下:
-- 建立樣本表t1
CREATE TABLE t1(p1 INT, c1 TIMESTAMP, c2 VARCHAR, c3 DOUBLE, PRIMARY KEY(p1));
-- 插入資料
UPSERT INTO t1(p1, c1, c2, c3) VALUES
(1, '2025-01-01 08:30:00', '2025-01-01 08:30:00', '12.24'),
(2, '1970-01-01 08:00:00.123', '1970-01-01 08:00:00.123', '10.32'),
(3, '1970-01-01 08:00:10.13579', '1970-01-01 08:00:10.13579', '10.12'),
(4, '1970-01-01 08:00:10.123456789', '1970-01-01 08:00:10.123456789', '17.33');樣本一:查詢TIMESTAMP或者時間戳記字串對應的Epoch時間戳記。
SELECT p1, UNIX_TIMESTAMP(c1), UNIX_TIMESTAMP(c2) FROM t1;返回結果:
+----+------------+------------+ | p1 | EXPR$1 | EXPR$2 | +----+------------+------------+ | 1 | 1735691400 | 1735691400 | | 2 | 0.123 | 0.123 | | 3 | 10.135 | 10.13579 | | 4 | 10.123 | 10.123457 | +----+------------+------------+樣本二:統計
UNIX_TIMESTAMP(c1) > 10的值。SELECT COUNT(*) FROM t1 WHERE UNIX_TIMESTAMP(c1) > 10;返回結果:
+--------+ | EXPR$0 | +--------+ | 3 | +--------+樣本三:將
UNIX_TIMESTAMP函數的轉換結果寫入c3(類型為DOUBLE)列。UPSERT INTO t1(p1, c3) VALUES(1, UNIX_TIMESTAMP('1970-01-01 08:00:00.123'));結果驗證
您可以執行
SELECT * FROM t1;語句驗證是否寫入成功。