from_unixtime(unix_timestamp(),'yyyyMMdd'),
--=======================
時間函數
--=======================
--當前時間戳
now()
current_timestamp()
--當前時間戳相對於 linux epoch 的秒數
unix_timestamp() , 不帶參數, 則返回 '1970-01-01 00:00:00' UTC 到現在的秒數
-- 轉換到相對於 linux epoch 的秒數
unix_timestamp(now()+ interval 3 days), 如果傳入 timestamp 參數, 返回該時間戳相對於 linux epoch 的秒數
unix_timestamp(string datetime, string format), 還支持傳入時間字符串, 返回值還是相對於 linux epoch 的秒數
-- 將秒數轉換到字符串
from_unixtime(int, 'yyyy/MM/dd HH:mm'), 將指定的時間戳,格式化為字符串. 時間戳參數應該是秒數格式, 所以該參數需要用 unix_timestamp() 包一下.
注意月份和分鍾對應的格式字符串, 常用的格式有 "yyyy-MM-dd HH:mm:ss.SSSSSS", "dd/MM/yyyy HH:mm:ss.SSSSSS", "MMM dd, yyyy HH.mm.ss (SSSSSS)"
-- 將時間戳轉換為日期字符串
to_date(timestamp) , 將指定時間戳轉換為日期字符串, 日期格式為 yyyy--MM-dd .
-- 將秒數轉換成時間戳
to_timestamp(bigint unixtime)
-- 將字符串轉換成時間戳
to_timestamp(string date, string pattern)
說明: impala 沒有直接將時間戳轉換為字符串的函數, 所以經常的寫法是: from_unixtime(unix_timestamp( t1 ),'yyyyMMdd HH:mm')
-- 時間戳取整
Impala 2.11 之前的取整當前時間的寫法:
select trunc(now(), 'YEAR') --取整到年份, 得到當年 1 月 1 日 0 點 0 分
select trunc(now(), 'MONTH') --取整到月份, 得到當月 1 日 0 點 0 分
select trunc(now(), 'DD') --取整到日期, 得到當天 0 點 0 分
select trunc(now(), 'DAY') --取整到星期, 得到本星期第一天的 0 點 0 分
select trunc(now(), 'HH24') --取整到小時, 得到當前小時的 0 分
select trunc(now(), 'MI') --取整到分鍾, 得到當前分鍾 0 秒
Impala 2.11 之后增加了 date_trunc() 函數, 下面是幾個取整的寫法:
date_trunc('year',now())
date_trunc('month',now())
date_trunc('week',now())
date_trunc('day',now())
date_trunc('hour',now())
date_trunc('minute',now())
date_trunc() 的語法和 date_part() 類似, 下面是完整的時間 part 列表:
microseconds
milliseconds
second
minute
hour
day
week
month
year
decade
century
millennium
-- 時間戳提取
date_part('year', now())
extract(now(), 'year')
extract(year from now())
-- 兩個時間戳比較
datediff(timestamp enddate, timestamp startdate) ,相差多少天, 精度是天
timestamp_cmp(now() + interval 70 minutes, now()), 比較兩個時間戳的大小, 本例的結果為 1
impala 沒有好用的 timestamp_diff() 函數, 比如我們想要知道兩個時間相差多少個小時, 不能直接求出, 下面是一個簡單的步驟:
1. 先算出一個小時對應的秒數是多少
2. 將兩個時間都轉成秒數, 然后做差, 然后除以一個小時的秒數.
-- 時間加減
時間戳可以直接加減 interval n days/months/years/hours/minutes .
也可以使用下面的函數:
years_add(timestamp t, int n)
years_sub(timestamp t, int n)
months_add(timestamp t, int n)
months_sub(timestamp t, int n)
days_add(timestamp t, int n)
days_sub(timestamp t, int n)
hours_add(timestamp t, int n)
hours_sub(timestamp t, int n)
minutes_add(timestamp t, int n)
minutes_sub(timestamp t, int n)
也可以用下面兩個通用的函數:
date_add(timestamp startdate, int days)
date_add(timestamp startdate, interval_expression)
date_sub(timestamp startdate, int days)
date_sub(timestamp startdate, interval_expression)
-- 月份相關的
last_day(timestamp t)
months_between(timestamp newer, timestamp older)