⽇期转换(函数)--hive和presto ⼀.timestamp 类型转换为其他类型
场景presto⽤法hive⽤法
转换成北京时区的string字符串,格式为y-m-d date_format(created_at
AT TIME ZONE
'Asia/Shanghai','%Y-
%m-%d')
如果需要到时分秒,可
在%Y-%m-%d'基础上加
格式
from_unixtime(unix_timestamp(from_utc_timestamp(`created_at`,'Asia/Shanghai')),
'yyyy-MM-dd')
如果需要到时分秒,格式为:yyyy-MM-dd HH:mm:ss
转换为时间戳(10位)to_unixtime(cast (‘2020-
04-30 10:10:15’ as
timestamp))
unix_timestamp(cast (‘2020-04-30 10:10:15’ as timestamp))
⼆.时间戳(10位) 转换为其他
场景presto⽤法hive⽤法
转换为timestamp,带时区cast(DATE_FORMAT(from_unixtime(created) AT TIME
ZONE 'Asia/Shanghai','%Y-%m-%d')  as timestamp)
from_utc_timestamp(cast(ated as
bigint)*1000 as timestamp), 'Asia/Shanghai')
转换为⽇期格式的string字符串DATE_FORMAT(from_unixtime(created) AT TIME ZONE
'Asia/Shanghai','%Y-%m-%d')
substr(from_utc_timestamp(cast(ated as
bigint)*1000 as timestamp), 'Asia/Shanghai'),1,10)
三.其他常见⽇期处理函数
--当前 ⽇期(0时区)
select CURRENT_DATE
--0时区
select CURRENT_timestamp
--北京时间
select from_utc_timestamp(CURRENT_timestamp,'Asia/Shanghai') date_format(created_at AT TIME ZONE 'Asia/Shanghai','%Y-%m-%d')
取上个⽉份 substr(add_months(CURRENT_DATE,-1),1,7)
取上个⽉末最后⼀天:  date_sub(trunc(a.gl_date,'MM'),1)
presto 取上个⽉:
date_format( date_add('month',-1,created_at) ,'%Y-%m')
四.presto 的⼀些特性(和mysql对⽐)
操作⽅
presto/hive mysql
等于presto严格的类型,等号两边字段类型要⼀致。如果不⼀致,需要
⼿⼯
cast(字段 as int/varchar)转成⼀致,时间类型要转成varchar
并且做字符串截取才能⽐较,
例如substr(cast(shipped_at as varchar),1,10). between
'2019-02-01' and '2019-03-01'
⽆限制
列名中⽂列名要⽤双引号⽆限制
判断语句if(), case when 判断条件1 then 结果1
when 判断条件2 then 结果2
else 结果3
end
建议⽤第⼆种
if()
空值设置默认值coalesce(列名,0) presto和hive都可以使⽤
如果第⼀个值为null(空),则转为0
nvl(列名,0)
decode 操作nexr_decode (case when 简化版)
例⼦:nexr_decode(a,b,c,d) 如果a=b,则c,else 则d。简单的
case when代替写法
decode
空值表达⽅式'',null 和0
presto中 这三个值是不同意思
不强制区别'',null 和0
json解析presto:
json_extract(json_parse(sku_info),'$.purchase_price_rmb')
hive版本:get_json_object
json_extract
时区转换date_format(created_at AT TIME ZONE 'Asia/Shanghai','%Y-%m-
unix时间戳转换日期格式%d')
date_format(convert_tz(created_at, '+00:00', '+08:00'),
'%y-%m-%d')
时间差,⼩时差presto date_diff('day',created_at,updated_at) hive 版本 是datediff()
date_diff presto 执⾏是 0 :
select date_diff('day' , timestamp '2019-04-04
07:33:59.000',timestamp '2019-04-05 00:00:00.000')
解决⽅法: presto如果想和mysql 保持⼀致
select date_diff('day' , date(timestamp '2019-04-04
07:33:59.000'),date(timestamp '2019-04-05
00:00:00.000'))
mysql 执⾏是 1 :
select DATEDIFF(timestamp '2019-04-05
00:00:00.000',timestamp '2019-04-04
07:33:59.000')

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。