Presto SQL 时间日期函数
時間&日期函數
-- 2021-04-15 14:40:18.791 Asia/Shanghai select now()-- 2021-04-15 select current_date-- 14:10:41.586 Asia/Shanghai select current_time-- 2021-04-15 14:13:03.720 Asia/Shanghai select current_timestamp-- 昨天的年月日 select current_date - interval '1' day;-- Asia/Shanghai select current_timezone()-- 輸出long類型timestamp:1610085216 select to_unixtime(cast('2021-01-08 13:53:36' as timestamp)) -- 2021-01-08 select cast('2021-01-08' as date)-- 2021-01-08 00:00:00.000 select cast('2021-01-08' as timestamp)-- 2021-01-10 00:00:00.000 select date_parse('20210110','%Y%m%d')-- 輸出date類型日期:2021-01-08 select date(cast('2021-01-08 10:36:15' as timestamp)) select date(cast('2021-01-08' as timestamp)) -- 輸出varchar類型日期:2021-01-10 select format_datetime(date_parse('20210110','%Y%m%d'),'yyyy-MM-dd')-- 輸出varchar類型日期:2021-01-08 select format_datetime(from_unixtime(to_unixtime(cast('2021-01-08 13:53:36' as timestamp))),'yyyy-MM-dd') select format_datetime(from_unixtime(to_unixtime(cast('2021-01-08' as timestamp))),'yyyy-MM-dd')-- 輸出varchar類型日期:2021-01-08 13:53:36 select format_datetime(from_unixtime(1610085216),'yyyy-MM-dd HH:mm:ss') select format_datetime(from_unixtime(1610085216),'yyyy-MM-dd') -- 輸出date類型日期:2021-01-08 select date_add('day',-2,cast('2020-01-10' as date))-- 輸出date類型日期:2021-04-13 select date_add('day',-2,current_date) select date_add('week',-2,current_date) select date_add('month',-2,current_date) select date_add('quarter',-2,current_date) select date_add('year',-2,current_date)select date_add('millisecond',-2,date_parse('20210110','%Y%m%d')) select date_add('second',-2,date_parse('20210110','%Y%m%d')) select date_add('minute',-2,date_parse('20210110','%Y%m%d')) select date_add('hour',-2,date_parse('20210110','%Y%m%d')) -- date_diff(unit, timestamp1, timestamp2) → bigint select date_diff('day','2021-04-10','2021-04-15')select date_diff('day',date_parse('20210105','%Y%m%d'),date_parse('20210110','%Y%m%d'))select date_diff('day',cast('2020-01-05' as date),cast('2020-01-10' as date)) select date_diff('month',cast('2020-01-05' as date),cast('2020-01-10' as date))Presto SQL 特殊用法與進階函數
1 try 函數 與 try_cast 函數
try(expression)try函數會其中表達式的異常情況,并將異常值返回為 NULL,如果不使用try函數,則語句出現異常時將直接報錯導致查詢失敗
您還可以搭配coalesce函數使用特定值替換 NULL 值,比如下列,將字段a轉換為整數,轉換失敗則可轉換為 0
coalesce(try(cast('a' as integer)), 0)以上類型轉換可以使用 try_cast 函數來實現,try_cast的作用與cast函數一致,都是對值進行類型轉換,區別在于try_cast在類型轉換錯誤時會返回 NULL,避免造成查詢失敗
coalesce(try_cast('a' as integer), 0)2 時間/日期函數
使用current_date、current_time、current_timestamp、localtime與localtimestamp時不用加圓括號,Presto 也不支持加圓括號的寫法,使用時請注意
2.1 字符串與時間的轉換
可以直接在字符串格式的時間表達式前加關鍵字timestamp,比如timestamp '2020-01-01 00:00:00',即可直接獲得對應的時間
date_parse與date_format分別是字符串轉時間以及時間轉字符串,用法都是傳入需要轉化的字段以及對應的 format,如下分別是字符串$part_date轉時間以及時間#event_time轉字符串:
date_parse("$part_date", '%Y-%m-%d') date_format("#event_time", '%Y-%m-%d %T')以上函數的 format 格式使用的是 MySQL 的格式,如需使用 JAVA 格式,可使用函數format_datetime與parse_datetime
2.2 時間計算函數
函數date_add可對時間進行偏移,unit為單位,value為偏移量,如果value為負數,則為往前偏移
date_add(unit, value, timestamp)函數date_diff,用來計算兩個時間的差值,算法是timestamp2 - timestamp1,返回的是單位為unit的整數
date_diff(unit, timestamp1, timestamp2)兩個函數的unit的取值范圍,可以參考以下表格
| millisecond | 毫秒 |
| second | 秒 |
| minute | 分鐘 |
| hour | 小時 |
| day | 日 |
| week | 周 |
| month | 月 |
| quarter | 季度 |
| year | 年 |
3 開窗函數
Presto 支持開窗函數,窗口函數中有不少非常實用的函數,如 first_value 與 last_value 很適合計算一段時間內第一次或最后一次做某事的值。
比如計算每名用戶首次產生購買商品行為時購買的物品:
SELECT user_id,first_purchase_product FROM (SELECT user_id,first_value(product_name) over(partition by user_id order by time) AS first_purchase_product FROM log.purchase) GROUP BY user_id,first_purchase_productfirst_value與last_value需要搭配over子句使用,over子句中的partition by類似于group by,即按照所給字段分組,order by則會決定進行排序的字段
4 JSON 解析
在一些特殊場景下,我們建議通過字符串的方式記錄復雜的數據結構,上傳到后臺。那么在之后的使用過程中,可以使用 JSON 解析函數轉化或提取能在 SQL 中使用的數據
4.1 字符串轉 JSON
json_parse可以將符合 JSON 格式的字符串轉成 SQL 中的 JSON 類型數據,兩函數等價:
json_parse('{"abc":[1, 2, 3]}')4.2 JSON 轉其他類型
轉化為 JSON 的數據,可以通過CAST轉化為其他 SQL 類型的數據,比如將剛剛轉成 JSON 的字符串再次轉成 MAP:
CAST(json_parse('{"abc":[1, 2, 3]}') AS MAP(varchar,array(integer)))如果希望將字符串重新轉成 JSON,可以使用json_format:
json_format(json_parse('{"abc":[1, 2, 3]}'))4.3 直接提取 JSON 數據
在很多情況下,只需要提取 JSON 中的部分數據即可,此時可以使用json_extract_scalar進行提取,其通過 JSONPath 表達式進行提取,返回字符串:
json_extract_scalar(json, json_path)并且json_extract_scalar可以直接對 JSON 的字符串進行提取,無需手動轉化為 JSON 類型,比如以下,提取abc的第一個元素:
json_extract_scalar('{"abc":[1, 2, 3]}','$.abc[0]')總結
以上是生活随笔為你收集整理的Presto SQL 时间日期函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MSP430F5529 DriverLi
- 下一篇: SQL常用日期函数