【问题标题】:How to find number of years between two timestamp dates in Hive?如何在 Hive 中查找两个时间戳日期之间的年数?
【发布时间】:2019-01-29 10:45:04
【问题描述】:

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

这是我在 SQL 中尝试过的。

在 SQL 中:

Datediff(年, date1, date2)

但在 Hive 中我尝试过:

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

但这会引发一个错误,说明

"无法识别表达式规范中'datediff''(''year'附近的输入"

谁能帮我学习这个新东西。

【问题讨论】:

  • extract(year from date2) - extract(year from date1) 会给你年份边界的数量......不知道是否需要。
  • @Sara 。 . .样本数据和期望的结果真的很有帮助。应该如何计算年份差异并不明显。

标签: sql hive hiveql


【解决方案1】:

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

1) 提取与减法

您可以简单地从两个日期中提取年份,然后对这两个值执行减法。

select abs(extract(year from "2019-01-29") - extract(year from "2020-01-20"));

这种方法的问题是,即使您减去同一年的第一天和最后一天,它也会返回 0,如果您的两个日期是 12 月 31 日和 1 月 1 日,它将返回 1,但如果这对用例和我们只需要看看两个日期之间的年份是否变化,那么这种方法很有用。

2) 日期差异函数

函数将返回 startdate 和 enddate 之间的天数。当您将其除以 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 函数,该函数将两个日期/字符串/时间戳作为输入,然后返回年/月/日/秒/分钟的差异。

您可以编写一个查询,也可以使用 hive 中的多个可用 UDF 执行相同的操作。

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

【讨论】:

    【解决方案2】:

    您可以尝试以下一种:

    SELECT YEAR(date1)-YEAR(date2)
    

    【讨论】:

      【解决方案3】:

      如果输入的是字符串和时间戳,那么你可以试试下面

      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)
      

      【讨论】:

        【解决方案4】:

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

        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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-01-23
          • 2017-07-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多