處理日期時間,將方便您對日誌後續查詢與可視化展示。本文向您介紹使用轉換函式進行日期時間資料類型轉換。
概念解釋
SLS SPL文法中的日期時間處理主要涉及三種資料類型:日期時間字串、日期時間對象和Unix時間戳記。
日期時間字串
日期時間字串的主要用途是為了便於展示以及提升使用者可讀性。SLS SPL文法中的日期時間字串主要分為兩種形式:
帶有時區資訊的日期時間字串,如
2019-06-02 18:41:26+08:00。不帶時區資訊的日期時間字串,如
2019-06-02 10:41:26。
帶有時區資訊的日期時間字串通過在日期時間後添加額外的時差資訊來表達時區:
2019-06-02 18:41:26+08:00表示該時間是東8區時區下的2019-06-02 18:41:26。2019-06-02 18:41:26-07:00表示該時間是西7區時區下的2019-06-02 18:41:26。
日期時間對象
執行個體化的日期時間,專指Datetime類型的資料。日期時間對象的主要用途是為了便於展示以及提升使用者可讀性。
Unix時間戳記
從1970年1月1日(UTC/GMT的午夜)開始所經過的秒數。Unix時間戳記的主要應用情境有:
表示系統時間。
日誌事件中表示日誌產生時間的元欄位
__time__,表示日誌接收時間的欄位__receive_time__等,這些欄位的值都使用Unix時間戳記來表示對應的系統時間,如下例所示。__source__: 192.0.2.1 __tag__:__receive_time__: 1562741899 __topic__: __time__: 1562731122時間相關的計算。
Unix時間戳記是從1970年1月1日開始所經過的秒數,因此在很多情境下便於直接進行日期時間相關的計算,例如如下樣本。
原始日誌
time1: 1562741899 time2: 1562731122SPL語句
* | extend time_diff = cast(time1 as BIGINT) - cast(time2 as BIGINT)查詢和分析結果
time1: 1562741899 time2: 1562731122 time_diff: 10777
資料類型轉換和轉換函式
轉換情境 | 轉換函式 | |
日期時間對象和Unix時間戳記的相互轉換 | 日期時間對象轉為Unix時間戳記。 | to_unixtime智能轉換函式,將日期時間對象或日期時間字串轉換為Unix時間戳記。 |
Unix時間戳記轉為日期時間對象。 | from_unixtime智能轉換函式,將Unix時間戳記轉換成無時區的日期時間對象。 | |
日期時間對象和日期時間字串的相互轉換 | 日期時間對象轉換為日期時間字串。 | date_format智能轉換函式,用於將timestamp類型的日期和時間對象轉換為指定格式的日期和時間字串。 |
日期時間字串轉換為日期時間對象。 | date_parse智能轉換函式,用於將日期和時間字串轉換為指定格式的timestamp類型的日期和時間對象。 | |
日期時間對象和Unix時間戳記的相互轉換
處理函數
to_unixtime轉換函式,將日期時間對象或日期時間字串轉換為Unix時間戳記。from_unixtime轉換函式,將Unix時間戳記轉換成帶時區的日期時間對象。
情境一:使用
to_unixtime轉換函式,將不帶時區的日期時間對象或日期時間字串轉換為Unix時間戳記。原始日誌
time: 2023-09-21 10:59:37.055SPL語句
* | extend time=cast(time as TIMESTAMP) | extend new_time=to_unixtime(time)查詢和分析結果
time: 2023-09-21 10:59:37.055 new_time:1695293977.055
情境二:使用
to_unixtime轉換函式,將帶時區的日期時間對象或日期時間字串轉換為Unix時間戳記。原始日誌
time: 2024-03-13_16:44:58.800+0800SPL語句
* | extend new_time=replace(replace(time, '+0800', ''), '_', ' ') | extend new_time = cast(to_unixtime(cast(new_time as TIMESTAMP)) as bigint) - 28800查詢和分析結果
time:2024-03-13_16:44:58.800+0800 new_time:1710319499
情境三:使用
from_unixtime轉換函式,將Unix時間戳記轉化無時區的timestamp類型的日期和時間。原始日誌
time:1695191402SPL語句
* | extend new_time=from_unixtime(cast(time as DOUBLE))查詢和分析結果
time: 1695191402 new_time:2023-09-20 06:30:02.000情境四:使用
from_unixtime轉換函式,將Unix時間戳記轉化帶時差的timestamp類型的日期和時間。原始日誌
time:1695191402SPL語句
* | extend new_time=from_unixtime(cast(time as DOUBLE) + 28800)查詢和分析結果
time:1695191402 new_time:2023-09-20 14:30:02.000
日期時間對象和日期時間字串的相互轉換
處理函數
date_format函數用於將timestamp類型的日期和時間對象轉換為指定格式的日期和時間字串。date_parse函數用於將日期和時間字串轉換為指定格式的timestamp類型的日期和時間對象。
情境一:使用
date_format將timestamp類型的日期和時間對象轉換為指定格式的日期時間字串。原始日誌
time: 2023-09-21 10:59:37.055SPL語句
* | extend time=cast(time as TIMESTAMP) | extend new_time=date_format(time, '%H:%i:%s')查詢和分析結果
time: 2023-09-21 10:59:37.055 new_time: 10:59:37
情境二:使用
date_parse將日期時間字串轉換為指定格式的timestamp類型的日期和時間對象。原始日誌
time: 2022-10-19 15:46:05SPL語句
* | extend time=cast(time as varchar) | extend new_time=date_parse(time, '%Y-%m-%d %H:%i:%s')查詢和分析結果
time: 2022-10-19 15:46:05 new_time: 2022-10-19 15:46:05.000