hive筆記:時間函數的使用+格式的轉換


一、時間函數的使用

1.from_unixtime(bigint unixtime[, string format]):將是將戳轉化為日期

將時間的秒值轉換成format格式(format可為“yyyy-MM-dd hh:mm:ss”,“yyyy-MM-dd hh”,“yyyy-MM-dd hh:mm”等等)如from_unixtime(1250111000,"yyyy-MM-dd") 得到2009-03-12

(1)時間戳為13位的情況:

問題:
其中第一個參數為bigint型數據,一般是10位的,遇到13位的時間戳,需要去掉最后三位才行,但是bigint型數據不支持直接算數運算,也不支持字符串截取
如,13位時間戳直接轉換
(1)10位的時間戳:
        select from_unixtime(1445391280,'yyyy-MM-dd HH:mm:ss');
結果:2015-10-21 09:34:40
(2)13位的時間戳:
        select from_unixtime(1445391280000,'yyyy-MM-dd HH:mm:ss');
結果:47772-08-17 01:46:40
兩種方法處理此問題:
a.一種是將bigint型數據先轉成double型計算之后再轉成bigint型,
   hive> select from_unixtime(cast(cast(1445391280000 as double)/1000 as bigint),'yyyy-MM-dd HH:mm:ss');
   2015-10-21 09:34:40
b.另一種是將bigint型數據轉成string型,截取之后再轉回bigint型。
   hive> select from_unixtime(cast(substr(cast(1445391280 as string),1,10) as bigint),'yyyy-MM-dd HH:mm:ss');
   2015-10-21 09:34:40

 案例:時間戳為13位的情況

 %jdbc(hive)
     select from_unixtime(cast(cast(pc.ttl as bigint) / 1000 as bigint), 'yy-mm-dd') as dt1,
     from_unixtime(cast(substr(pc.ttl,0,10) as int),'yy-MM-dd HH:mm:ss')  as dt2,
     from_unixtime(cast(cast(pc.ttl as bigint) / 1000 as bigint), 'yyyy-mm-dd') as dt3,
     from_unixtime(cast(substr(pc.ttl,0,10) as int),'yyyy-MM-dd HH:mm:ss')  as dt4
     from xxxx  pc

2.unix_timestamp獲取當前UNIX時間戳函數:(將日期轉化為時間戳)

(1) unix_timestamp()

返回值:   bigint
說明: 獲得當前時區的UNIX時間戳

(2) unix_timestamp(string date)

返回值:   bigint
說明: 轉換格式為“yyyy-MM-dd HH:mm:ss“的日期到UNIX時間戳。如果轉化失敗,則返回0。

(3)unix_timestamp(string date, string pattern)

返回值: bigint
說明: 轉換pattern格式的日期到UNIX時間戳。如果轉化失敗,則返回0。

(4)案例如下(yy-MM-dd和yyMMdd兩種時間格式):最好使用unix_timestamp(string date, string pattern)轉化,表明時間格式

       a.yyMMdd

%jdbc(hive)  
select  a.dt as time,unix_timestamp(a.dt) as time1,
           unix_timestamp(a.dt,'yyMMdd') as time2,
           concat('20',a.dt) as dt0,
           unix_timestamp(concat('20',a.dt)) as dt1,
           unix_timestamp(concat('20',a.dt),'yyyyMMdd') as dt2
from track.click a
where concat('20',a.dt)>='20181101' and concat('20',a.dt)<='20181103'
limit 100

     b.yyyy-MM-dd

select created_at,
     unix_timestamp(created_at) created_at1,
     substr(created_at,1,10)as dt0,---結果為時間戳
     unix_timestamp(substr(created_at,1,10))dt1,---結果為空
     unix_timestamp(substr(created_at,1,10),'yyyy-MM-dd') dt2---結果時間戳
from trial_sdk.device
where created_at>='2018-11-01' and created_at<='2018-11-03'
limit 100

3. 獲取年、月、日、天、小時、分鍾、秒、周數、星期幾、季節函數

select created_at,year(created_at),  --年

month(created_at),--

day(created_at),--

hour(created_at),--小時

minute(created_at),--分鍾

second(created_at),--

weekofyear(created_at),--第幾周

dayofweek(created_at),--星期幾

ceil(month(created_at)/3)--季節

from trial_sdk.device

where to_date(created_at)='2019-08-27'

4. 日期計算函數

日期(月份)增減函數

 (1) 日期往后推幾天,使用date_add函數,日期往前推幾天,使用date_sub函數;

select created_at,date_add(created_at,10) daslater,date_sub(created_at,10) daysoff 

from trial_sdk.device

where to_date(created_at)='2019-08-27'

(2)月份往后推幾個月,使用add_months函數,參數為正數;月份往前推幾個月,參數為負數

select created_at,add_months(created_at,3) monthslater,

                            add_months(created_at,-3) monthsoff 

from trial_sdk.device

where to_date(created_at)='2019-08-27'

5. 兩個日期(月份)相減函數

 (1)日期相減使用date_diff函數,返回相差天數;月份相減使用months_between,返回相差月份,不足月為小數

    select datediff('2019-08-23', '2019-08-21'),

       months_between('2019-08-21', '2019-07-25')

結果:2  0.87096774

(2)若計算兩個之間相差的小時數,可以使用:

select hour('2019-08-23 10:11:12')-hour('2019-08-21 12:20:20') 

          +(datediff('2019-08-23 10:11:12','2019-08-21 12:20:20'))*24

結果:46

6. 獲取月初(月末)、年初(年末)日期

  • 獲取月末日期使用last_day函數,
  • 獲取月初日期使用trunc(,'MM')函數;
  • 獲取年初日期使用trunc(,‘YY’)函數,使用date_sub(add_months(trunc('',

select last_day(created_at),  --月末

trunc(created_at, 'MM'),  --月初

trunc(created_at, 'YY')--年初

date_sub(add_months(trunc(created_at, 'YY'),12),1) --年末

from trial_sdk.device

where to_date(created_at)='2019-08-27'

 

7. 獲取日期的下個星期幾的日期

 使用函數next_day獲取日期下個星期幾的日期,

 參數: 周一:MO;周二:TU;周三:WE ;周四:TH ;周五:FR ;周六:SA;周日SU

select next_day(created_at, 'MO'),---下個星期一的日期:9.2

          next_day(created_at, 'TU'),---下個星期二的日期:9.3

          next_day(created_at, 'WE'),---下個星期三的日期

    next_day(created_at, 'TH'),---下個星期四的日期

           next_day(created_at, 'FR'),---下個星期五的日期

    next_day(created_at, 'SA'),---下個星期六的日期

          next_day(created_at, 'SU') ---下個星期日的日期

from trial_sdk.device

where to_date(created_at)='2019-08-27' 

二、時間格式的轉換

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM