[英]How to find number of years between two timestamp dates in Hive?
我正在尝试寻找Hive中两个时间戳记日期之间的年数。
这是我在SQL中尝试过的。
在SQL中:
Datediff(年,日期1,日期2)
但是在Hive中,我尝试过:
Datediff(year(date1), year(date2))
但这引发了一个错误,指出
“无法识别表达式规范中'datediff''(''year'附近的输入”
有人可以帮助我学习这一新事物吗?
有多种方法可以达到这样的结果:
1)提取与减去
您可以简单地从两个日期中提取年份,然后对这两个值进行减法。
select abs(extract(year from "2019-01-29") - extract(year from "2020-01-20"));
这种方法的问题是,即使您减去同一年的第一天和最后一天,它也会返回0;如果您的两个日期分别是12月31日和1月1日,则它将返回1,但是如果这对用例无害,我们只需要看看年份是否在两个日期之间发生了变化,那么这种方法会很有用。
2)datediff函数
函数将返回开始日期和结束日期之间的天数。 当您将其除以365.25时,它将返回以小数位表示的年数。
select datediff('2019-02-01', '2019-01-27')/365.25;
您可能希望将上述查询的结果截断为两位小数。 如果仅在寻找整数,则将其转换为整数。
select cast(datediff('2019-02-01', '2019-01-27')/365.25 as int);
3)months_between函数
此函数将返回两个日期之间相差的月份数。
select abs(cast(months_between('2019-01-10', '2020-01-10')as int));
上面的查询将返回12作为结果。 如果您想要以年为单位的结果,则可以将以上查询的结果除以12。
4)自定义UDF
然后,上述方法非常复杂,因为您需要编写自定义UDF函数,然后针对所有情况进行验证。
编写一个自定义UDF函数,该函数将两个日期/字符串/时间戳作为输入,然后返回年/月/日期/秒/分钟的差异。
您可以使用配置单元中的多个可用UDF编写一个查询,也可以执行相同的操作。
这是供您参考的链接: Hive语言手册
您可以尝试以下一种:
SELECT YEAR(date1)-YEAR(date2)
如果输入是字符串和时间戳,那么您可以在下面尝试
hive> select current_timestamp();
OK
2019-01-29 04:57:04.128
hive> select year(from_unixtime(unix_timestamp('2019-01-29 04:57:04.128', 'yyyy-MM-dd HH:mm:ss.SSS'), 'yyyy-MM-dd'));
OK
2019
hive> select year(from_unixtime(unix_timestamp('2021-01-29 04:57:04.128', 'yyyy-MM-dd HH:mm:ss.SSS'), 'yyyy-MM-dd')) - year(from_unixtime(unix_timestamp('2019-01-29 04:57:04.128', 'yyyy-MM-dd HH:mm:ss.SSS'), 'yyyy-MM-dd'));
OK
2
Time taken: 0.054 seconds, Fetched: 1 row(s)
假设您想要一个整数,则可以直接进行计算:
select (case when date_format(date1, 'MMDD') < date_format(date2, 'MMDD')
then year(date1) - year(date2) - 1
else year(date1) - year(date2)
end)
或者您可以使用一个近似值:
select datediff(date1, date2) / 365.25
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.