Hive如何将日期字符串只转换为日期格式?
问题描述:
有没有一种优雅的方式将蜂巢中的“出生日期”列转换为格式如“28-Mar-99”到“1999-03-28”?Hive如何将日期字符串只转换为日期格式?
我用下面的查询来处理这些,它适用于2000年以后的日期,但对于2000年以前的日期,它给出NULL或20XX。
select a.d_cancel,
from_unixtime(unix_timestamp(a.d_cancel ,'dd-MMM-yy'), 'yyyy-MM-dd') as new_date
from test_table a;
d_cancel new_date
0 12-Apr-07 2007-04-12
1 31-Dec-99 NULL
2 20-Sep-98 2098-09-20
答
您可以使用此查询:
-- D/M/Y format (everywhere else)
SELECT CAST(DAY(@date) AS varchar(2)) + '/'
+ CAST(MONTH(@date) AS varchar(2)) + '/'
+ CAST(YEAR(@date) AS varchar(4))
+0
- D/M/Y格式(其他地方) SELECT CAST(DAY(@date)AS varchar(2))+' - ' + CAST(MONTH(@date)AS varchar(2))+'/' + CAST(YEAR(@date)AS varchar(4)) – MojtabaNava
答
DECLARE @Day VARCHAR(10)='28-Mar-99'
SELECT CONVERT (DATE,@Day,126) AS ConvertedDate
DECLARE @Day VARCHAR(10)='28-Mar-99'
SELECT CAST (@Day AS DATE) AS ConvertedDate
答
我也有类似的问题。我这个解决它:
select
if(to_date(from_unixtime(unix_timestamp(old_date_of_birth, "ddMMMyy"))) < from_unixtime(unix_timestamp()),
to_date(from_unixtime(unix_timestamp(old_date_of_birth, "ddMMMyy"))),
concat(year(to_date(from_unixtime(unix_timestamp(old_date_of_birth, "ddMMMyy"))))-100, SUBSTRING(to_date(from_unixtime(unix_timestamp(old_date_of_birth, "ddMMMyy"))),5,10))
) as new_date_of_birth
from users
在我的情况的日期是在DDMMMYY格式(24MAR93)和我没有你提到的空的问题。但是,我对未来的出生日期确实存在问题。
由于这是一个迟到的答案,我假设你已经解决了这个问题,但它可能会帮助其他用户。
如何判断99年3月28日是2000年之前还是之后? – jarlh
为什么我想问这些问题呢是我需要处理的数据集中有很多日期类似这些。从我的理解到数据集,99年3月28日意味着28-Mar-1999。如果我想获得2099年3月28日,上面的查询应该能够正确地得到它。 – Gavin
你怎么知道99年3月28日意味着1999年3月28日?可能你有一些认识年的规则?只要实施它们。像这样:'当cast(substr(your_date,8,2)为int)> $ this_year then 19 else 20以sentury'结尾的情况。注意:只有你知道你的规则。如果您的日期可能在将来和过去一样,那么信息已经丢失,无法恢复 – leftjoin