【问题标题】:Last Quarter End-Date in Spark SQLSpark SQL 中的上个季度结束日期
【发布时间】:2020-12-27 20:33:21
【问题描述】:

我有一个计算上一季度结束日期的 SQL-Server 查询。现在,我需要将此查询转换为Spark-SQL 查询。

Sql-Server 查询和一些示例示例如下:

select dateadd(dd, -1, dateadd(qq, datediff(qq, 0, cast('2020-09-09' AS DATE)), 0)) as end_dt

输出:2020-06-30

要为另一个 (2021-01-10) 日期计算相同的值:

select dateadd(dd, -1, dateadd(qq, datediff(qq, 0, cast('2021-01-10' AS DATE)), 0)) as end_dt

输出:2020-12-31

问题:如何在 Spark SQL 查询 (v2.4) 中实现相同的功能?如何根据上面的SQL-Server 示例和下面的所需输出计算上一季度的最后一天

input_date | end_date
------------------------
2020-01-21 | 2019-12-31
2020-02-06 | 2019-12-31
2020-04-15 | 2020-03-31
2020-07-10 | 2020-06-30
2020-10-20 | 2020-09-30
2021-02-04 | 2020-12-31

感谢任何帮助。谢谢。

【问题讨论】:

    标签: sql sql-server apache-spark datetime apache-spark-sql


    【解决方案1】:

    你可以使用date_trunc():

    select date_add(
        date_trunc(cast('2020-09-09' as date), 'quarter'), 
        -1
    ) as end_dt
    

    【讨论】:

    • 它返回一个 Null 值
    • quarter 说明符放在开头似乎可以解决问题 - select date_add( date_trunc('quarter', cast('2020-09-09' as date)), -1 ) as end_dt
    【解决方案2】:

    查找给定日期的直接季度结束日期。

    select add_months(last_day(date_trunc('quarter',to_timestamp('2020-12-03','yyyy-MM-dd'))),2) as end_dt
    

    查找给定日期的直接年终日期。

    select add_months(last_day(date_trunc('year',to_timestamp('2020-06-03','yyyy-MM-dd'))),11) as end_dt
    

    查找给定日期的即时双年度结束日期。

    select case when quarter(to_timestamp('2020-11-03','yyyy-MM-dd')) >=3 then 
    add_months(last_day(date_trunc('year',to_timestamp('2020-11-03','yyyy-MM-dd'))),11) 
              when quarter(to_timestamp('2020-11-03','yyyy-MM-dd')) < 3 then 
    add_months(last_day(date_trunc('year',to_timestamp('2020-11-03','yyyy-MM-dd'))),5)
              end as end_dt
    

    【讨论】:

      猜你喜欢
      • 2018-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多