hive 時間戳的轉換方法

2021-10-25 09:17:29 字數 3728 閱讀 8430

由於頻繁使用,沒有乙個博文是完整的,所以整理歸納了一下,遇到了sqlserver的不同語法就也寫下來了;

hive :select distinct from_unixtime(1441565203,『yyyy/mm/dd hh:mm:ss』) from test_date;

sqlsever:convert ( varchar ( 10 ), dateadd ( s, enter_log.click_time / 1000, '1970-01-01 08:00:00' ), 120 ) visit_date,

注意 :/1000是因為入參的時間戳是毫秒級單位的入參;

hive :select distinct unix_timestamp(『20111207 13:01:03』) from test_date; // 預設格式為「yyyy-mm-dd hh:mm:ss「

hive :select distinct unix_timestamp(『20111207 13:01:03』,『yyyymmdd hh:mm:ss』) from test_date;

方法1: from_unixtime+ unix_timestamp

–20181205轉成2018-12-05

hive :select from_unixtime(unix_timestamp(『20181205』,『yyyymmdd』),『yyyy-mm-dd』) from dual;

–2018-12-05轉成20181205

hive :select from_unixtime(unix_timestamp(『2018-12-05』,『yyyy-mm-dd』),『yyyymmdd』) from dual;

方法2: substr + concat

–20181205轉成2018-12-05

hive :select concat(substr(『20181205』,1,4),』-』,substr(『20181205』,5,2),』-』,substr(『20181205』,7,2)) from dual;

–2018-12-05轉成20181205

hive :select concat(substr(『2018-12-05』,1,4),substr(『2018-12-05』,6,2),substr(『2018-12-05』,9,2)) from dual;

注:1.值得注意的是,時間戳有可能是毫秒級的,然後這時候直接使用from_unixtime(1441565203,『yyyy/mm/dd hh:mm:ss』)的話就會得到很奇怪的日期了,這時候要這樣from_unixtime(cast(151331629920/1000 as int)),同樣的,時間轉成毫秒級的時間戳也要乘以1000,如:unix_timestamp(『2018-12-18 00:38:50』)*1000

2.如何區分時間戳是秒級還是毫秒級呢?一般來說,常見的時間戳是10位數的,13位數的時間戳就是毫秒級的

hive :  轉當天日期:if(visit_time is null , 0, cast(from_unixtime(if(visit_time>9999999999, cast(visit_time / 1000 as bigint), visit_time), 'yyyymmdd') as int)) visit_date,

hive :   轉當年週數:cast(concat(from_unixtime(if(visit_time>9999999999, cast(visit_time / 1000 as bigint), visit_time), 'yyyy'), weekofyear( from_unixtime(if(visit_time>9999999999, cast(visit_time / 1000 as bigint), visit_time), 'yyyy-mm-dd')) ) as bigint) visit_weekth,

hive :   轉當年月份:cast(from_unixtime(if(visit_time>9999999999, cast(visit_time / 1000 as bigint), visit_time), 'yyyymm') as bigint) visit_month

由於業務需要分析使用者不同週數 月數的留存情況,而轉換之後的日期間隔比如 週數最大一年為52周 201952 和202052 ,兩個週數直接相減並不能得到正確的間隔週數或者月數

間隔月數

select floor(months_between('2018-07-01','2018-02-04')) from default.dual

返回值為: 4

注意: 

1.日期格式為: yyyy-mm-dd;

2.如果日期格式為: yyyymmdd,則需要使用轉換為yyyy-mm-dd

轉換函式為:from_unixtime(unix_timestamp(,'yyyymmdd'),'yyyy-mm-dd');

3.floor是取整函式。

select datediff('2015-04-09','2015-04-01');

輸出:8

select date_sub('2015-04-09',4);

輸出:2015-04-05

select date_add('2015-04-09',4);
select if(pmod(datediff('2018-05-20', '1920-01-01') - 3, 7)='0', 7, pmod(datediff('2018-05-20', '1920-01-01') - 3, 7)) 

輸出:7

--上個月第一天

select trunc(add_months(current_timestamp,-1),'mm')

select concat(substr(add_months(from_unixtime(unix_timestamp(),'yyyy-mm-dd'),-1),1,7),'-01');

--上個月最後一天

select date_sub(trunc(current_timestamp,'mm'),1);

晴天霹靂!!!做好了整個資料,突然到了2020/12/1 選擇日期到2023年的時候 突然發現跨年的週數

2020-12-31 所在的週是2020-53  而 2021-01-01 拼接之後 變成2021-53,仔細研究了一下weekofyear函式的描述

不定期完善

hive中日期與時間戳轉換

從1970 01 01 00 00 00 utc到指定時間的秒數。總結 時間戳到日期時間,日期時間到時間戳,日期時間到日期。獲取時間戳 select distinct unix timestamp from test date 時間戳 日期 select distinct from unixtime...

Hive中日期與時間戳轉換

1.時間戳轉成日期 select distinct from unixtime 1441565203,yyyy mm dd hh mm ss from test date 2.日期轉成時間戳 select distinct unix timestamp 20111207 13 01 03 from ...

Hive中日期與時間戳的轉換

什麼是時間戳?時間戳是指 格林尼治時間 1970年01月01日00時00分00秒 北京時間1970年01月01日時00分00秒 起至現在的總秒數。注意 不管你在地球上的任何地方,這一時刻的時間戳是相同的。但是!同乙個時間戳在不同的時區會表示不同的時間。比如在集群上通過hive函式轉換的是北京時間,但...