【问题标题】:Get days difference between two datetimes in SparkSQL获取 SparkSQL 中两个日期时间之间的天数差异
【发布时间】:2021-11-15 01:28:24
【问题描述】:

我想获取 SparkSQL 中两个日期时间之间的 整数 天差,但它忽略了时间部分并返回与预期不同的结果。

例如,下面的查询返回 9,但我期望的是 8:

SELECT DATEDIFF(CAST('2021-07-10 02:26:16' AS TIMESTAMP), CAST('2021-07-01 19:10:28' AS TIMESTAMP))

我可以通过将 datetime 转换为 long 来达到预期的结果,因此我可以得到它们之间的秒差并将结果转换为天,转换为整数,例如:

SELECT CAST((CAST(CAST('2021-07-10 02:26:16' AS TIMESTAMP) AS LONG) - CAST(CAST('2021-07-01 19:10:28' AS TIMESTAMP) AS LONG))/(60*60*24) AS INTEGER)

我想知道是否有“更推荐的方式”来做到这一点,比如使用一些内置的 SparkSQL 函数。

提前致谢。

【问题讨论】:

    标签: date datetime apache-spark-sql datediff


    【解决方案1】:

    我建议使用extract SQL function 并将其应用于间隔(两个时间戳的差异)。

    提取日期/时间戳或间隔来源的一部分

    *) extract 函数在 Spark 3.x 版本中可用。

    见下例

    WITH input AS (
        select TIMESTAMP'2021-07-10 02:26:16' t2,
               TIMESTAMP'2021-07-01 19:10:28' t1
    )
    SELECT
        datediff(t2, t1) `datediff`,
        extract(day FROM t2-t1) `extract`
    FROM input
    

    返回

    datediff extract
    9 8

    【讨论】:

    • 我尝试了这段代码,但失败并出现以下错误:AnalysisException: cannot resolve '(input.t2 - input.t1)' due to data type mismatch: '(input.@987654328 @ - input.t1)' 需要(数字或日历间隔)类型,而不是时间戳;
    • 您使用的是哪个 spark 版本?我的使用 Spark 3.0.1 运行。
    • 它是 v2.4.5。也许这就是它失败的原因。我喜欢你的建议,对我来说它看起来更漂亮。谢了!
    猜你喜欢
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    相关资源
    最近更新 更多