在spark sql中计算两个日期之间的日期差



我在athena和spark-sql中计算一些sql时遇到困难

如果我在Athena中运行下面的sql我得到结果为2

select date_diff('month',cast('2022-12-29' as date),cast('2023-02-28' as date)) - result 2

但是如果我在spark-sql中运行等效代码我得到的输出是1

spark.sql("select floor(months_between(cast('2023-02-28' as date),cast('2022-12-29' as date)))").show(5,0) - result 1

我想知道是否有任何方法可以在雅典娜和Spark中获得统一的结果

这两个函数做的事情完全不同。在雅典娜中,根据文档,date_diff这样做:

具体来说,DATEDIFF决定两个表达式之间交叉的日期部分边界的数量。例如,假设您正在计算两个日期(12-31-2008和01-01-2009)之间的年差。在本例中,函数返回1年,尽管这些日期只相隔一天。如果要查找两个时间戳(01-01-2009 8:30:00和01-01-2009 10:00:00)之间的小时差,则结果是2小时。如果要查找两个时间戳(8:30:00和10:00:00)之间的小时差,则结果为2小时。

在spark文档不是很清楚,但说:

返回日期date1和date2之间的月数。如果date1晚于date2,则结果为正。如果两个输入都是当月的同一天,或者两个输入都是各自月份的最后一天,则返回一个整数。

基本上,在spark中,结果是日期之间的十进制月数,如1.6666,这反映了两个日期之间的实际持续时间。

为了更接近雅典娜的date_diff在火花中的行为,可以预先使用date_trunc。如文档中所述,如果两个日期共享同一个月的同一天,结果将是一个整数。

spark
.sql("select months_between(date_trunc('MONTH', '2023-02-28'), date_trunc('MONTH', '2022-12-29')) as diff")
.show
+----+
|diff|
+----+
| 2.0|
+----+

最新更新