需求:某資產近一個月的資產值
比如:今天是2018年2月28日,近一個月若是按照自然月來算,那么是2018年2月1日至2018年2月28日。最終需要的日期格式為:yyyyMMdd。
當日時間戳
unix_timestamp() 方法可得到當前時間的時間戳。
上月今日
使用 add_months(日期,N) 函數可將日期往前、往后推N個月。主要有兩種格式:
add_months(‘yyyy-MM-dd hh:mm:ss’,N),add_months(‘yyyy-MM-dd’,N)。N為正往后推,N為負往前推。例如:
hive> select add_months('2018-02-28', 3); OK 2018-05-31 Time taken: 0.127 seconds, Fetched: 1 row(s) hive> select add_months('2018-02-28', -3); OK 2017-11-30 Time taken: 0.084 seconds, Fetched: 1 row(s)
時間戳格式化
由於add_months()方法的入參“日期”不能直接使用時間戳,需做一下轉化。轉化函數為:from_unixtime(時間戳, 日期、時間)。表現形式主要有:from_unixtime(時間戳, “yyyy-MM-dd hh:mm:ss”),from_unixtime(時間戳, “yyyy-MM-dd “)。如下:
hive> select from_unixtime(1519818348, 'yyyy-MM-dd'); OK 2018-02-28 Time taken: 0.088 seconds, Fetched: 1 row(s) hive> select from_unixtime(1519818348, 'yyyy-MM-dd hh:mm:ss'); OK 2018-02-28 07:45:48 Time taken: 0.089 seconds, Fetched: 1 row(s)
往后一日
根據需求,當前日期往前推一個月后,還需往后推一日。往前、往后推N個日的函數為:date_add(日期,N)。主要有兩種轉換格式:date_add(‘yyyy-MM-dd hh:mm:ss’,N),date_add(‘yyyy-MM-dd’,N)。N為正往后推,N為負往前推。如下:
hive> select date_add('2018-02-28', 3); OK 2018-03-03 Time taken: 0.089 seconds, Fetched: 1 row(s) hive> select date_add('2018-02-28', -3); OK 2018-02-25 Time taken: 0.085 seconds, Fetched: 1 row(s)
最終結果是:
from_unixtime(unix_timestamp(concat(date_add(add_months(from_unixtime(unix_timestamp(),'yyyy-MM-dd hh:mm:ss'),-1),1),' 10:10:10')), 'yyyyMMdd')
我感覺他的 concat 一步還是比較多余,應該是沒有深入理解unix_timestamp函數=》去使用拼串去 符合默認參數格式 ,最好指定參數格式
推薦
from_unixtime(unix_timestamp(date_add(add_months(from_unixtime(unix_timestamp(),'yyyy-MM-dd hh:mm:ss'),-1),1),'yyyy-MM-dd'), 'yyyyMMdd')