繁体   English   中英

如何在Hive中找到两个时间戳日期之间的年数?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM