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

时间:2019-01-29 10:45:05

标签: sql hive hiveql

我正在尝试寻找Hive中两个时间戳记日期之间的年数。

这是我在SQL中尝试过的。

在SQL中:

日期差异(年,日期1,日期2)

但是在Hive中,我尝试过:

Datediff(year(date1), year(date2))

但是这引发了一个错误,指出

  

“无法识别表达式说明中'datediff''(''year'附近的输入”

有人可以帮助我学习这个新东西吗?

4 个答案:

答案 0 :(得分:1)

有多种方法可以达到这种效果:

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)个功能之间的月数

此函数将返回两个日期之间相差的月份数。

select abs(cast(months_between('2019-01-10', '2020-01-10')as int));

以上查询将返回12作为结果。如果要以年数为单位,则可以将上述查询的结果除以12。

4)自定义UDF

这种方法非常复杂,因此您需要编写自定义UDF函数然后针对所有情况进行验证。

编写一个自定义UDF函数,该函数将两个日期/字符串/时间戳记作为输入,然后返回以年/月/日期/秒/分钟为单位的差异。

您还可以使用配置单元中的多个可用UDF编写一个查询,同样执行相同的操作。

以下是供您参考的链接: Hive Language Manual

答案 1 :(得分:0)

您可以尝试以下一种方法:

SELECT YEAR(date1)-YEAR(date2)

答案 2 :(得分:0)

如果输入的是字符串和时间戳,则可以在下面尝试

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)

答案 3 :(得分:0)

假设您想要一个整数,则可以直接进行计算:

var x = { Name: 'Matt\\\'s Test'};
var y = x.Name;
console.log(y);

或者您可以使用一个近似值:

select (case when date_format(date1, 'MMDD') < date_format(date2, 'MMDD')
             then year(date1) - year(date2) - 1
             else year(date1) - year(date2)
        end)