如何在配置单元中找到两个时间戳日期之间的年数?

ff29svar  于 2021-06-27  发布在  Hive
关注(0)|答案(4)|浏览(329)

我想找出Hive中两个时间戳日期之间的年数。
这是我在sql中尝试的。
在sql中:
日期差异(年,日期1,日期2)
但在 hive 里我试过:

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

但这会产生一个错误
无法识别“datediff”(表达式规范中的“year”)附近的输入
有人能帮我学这个新东西吗。

fruv7luv

fruv7luv1#

假设需要整数,可以直接进行计算:

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
hfwmuf9z

hfwmuf9z2#

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

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)
nfzehxib

nfzehxib3#

您可以尝试以下方法:

SELECT YEAR(date1)-YEAR(date2)
mfuanj7w

mfuanj7w4#

有多种方法可以达到这样的效果:
1) 提取和减法
您只需从两个日期中提取年份,然后对这两个值执行减法。

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

这种方法的问题是,即使减去同一年的第一天和最后一天,它也将返回0,如果两个日期是12月31日和1月1日,它将返回1,但如果这对usecase无害,我们只需要看看两个日期之间的年份是否发生了变化,那么这种方法是有用的。
2) datediff函数
函数将返回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) 函数之间的时间间隔
此函数将返回两个日期之间的月数差。

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

上面的查询结果将返回12。如果你想得到年数的结果,那么你可以将上述查询的结果除以12。
4) 自定义自定义项
这种方法很复杂,因为您需要编写自定义udf函数,然后针对所有场景进行验证。
编写一个自定义的udf函数,它以两个日期/字符串/时间戳作为输入,然后返回以年/月/日期/秒/分钟为单位的差值。
您还可以使用配置单元中的多个可用自定义项编写查询,执行相同的操作。
以下是供您参考的链接:hive语言手册

相关问题