DATEDIFF在SPARK SQL中的用法

22

我是Spark SQL的新手。我们正在将数据从SQL Server迁移到Databricks。 我正在使用SPARK SQL。您能否建议如何在SPARK SQL中实现以下功能以进行日期函数处理。我发现datediff只能在spark sql中返回天数。

DATEDIFF(YEAR,StartDate,EndDate)
DATEDIFF(Month,StartDate,EndDate) 
DATEDIFF(Quarter,StartDate,EndDate)
3个回答

40

正如你所提到的,SparkSQL确实支持DATEDIFF,但仅限于天数。我还要注意一点,因为在Spark中参数似乎是相反的,即

--SQL Server
DATEDIFF ( datepart , startdate , enddate )

--Spark
DATEDIFF ( enddate , startdate )

然而,Spark支持一个类似的函数叫做months_between,您可以使用它来替代DATEDIFF(month ...)。该函数同样返回一个小数值,如果需要类似的功能,可将其转换为INT

SELECT startDate, endDate, 
  DATEDIFF( endDate, startDate ) AS diff_days,
  CAST( months_between( endDate, startDate ) AS INT ) AS diff_months      
FROM yourTable
ORDER BY 1;

还有 yearquarter 函数可以分别确定日期的年份和季度。你可以简单地减去年份,但季度会更棘手。可能需要“做数学运算”,或者最终使用日历表。


非常感谢。这真的很有帮助。是的,季度差异看起来很棘手。 - SQLGirl
1
只是为了澄清,SQL server 似乎需要使用 DATEDIFF(datepart, recentDate, olderDate) 函数,因为 startdate 和 enddate 有些模糊。 - nrmad

3
由于Spark不提供其他的单位,因此我使用以下方法:
select 
    (bigint(to_timestamp(endDate))) - (bigint(to_timestamp(startDate))) as time_diff

这会得到第二个单位,因此除以60或3600可以转换单位。


0

Spark最近的更新支持datediff(endDate,StartDate)函数,返回天数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接