首页 > 解决方案 > 在 hive 中将年月转换为日期格式

问题描述

我有如下的年月格式。年和月是列名

Year  Month
2020  January
2019  October

并希望将它们转换为以下格式

01-01-2020
01-10-2019

我曾尝试与

cast(concat('01-',substring(month,1,3),'-',year) as timestamp) as Date_col

但无法使其工作。非常感谢您的帮助。谢谢!!

标签: sqldatehivetimestamphiveql

解决方案


您正在尝试转换01-Jan-2019为时间戳,但即使它有效,Hive 中的时间戳也不是必需的格式:dd-MM-yyyy. 时间戳具有以下格式:('yyyy-MM-dd HH:mm:ss.SSSSSSSSS'纳秒是可选的)。

unix_timestamp函数以秒为单位将给定格式字符串转换为 unix 时间戳,from_unix_time将 unix 时间戳转换为给定格式。

用于from_unixtime(unix_timestamp(concat('01-',month,'-',year),'dd-MMM-yyyy'),'dd-MM-yyyy')转换'dd-MMM-yyyy''dd-MM-yyyy'

演示:

with 
your_data as (
select stack(2, 
2020, 'January',
2019, 'October'
        ) as ( Year, Month)
)
select Year, Month, from_unixtime(unix_timestamp(concat('01-',month,'-',year),'dd-MMM-yyyy'),'dd-MM-yyyy')  as Date_col
from your_data
;

结果:

year    month     date_col
2020    January   01-01-2020
2019    October   01-10-2019

这也将起作用(不与 连接01-,使用'MMM-yyyy'格式):

from_unixtime(unix_timestamp(concat(month,'-',year),'MMM-yyyy'),'dd-MM-yyyy')

如果要转换为真正的时间戳,请在不指定输出格式的情况下执行相同操作:

from_unixtime(unix_timestamp(concat(month,'-',year),'MMM-yyyy')) --returns 2020-01-01 00:00:00

使用SimpleDateFormat类文档作为格式参考


推荐阅读