如何将字符串季度年转换为 Databricks 中的时间戳 SQL

How can I convert a string quarter year to a timestamp in Databricks SQL

在 Databricks SQL 中,如何将字符串格式 "2021Q2" 的日期转换为该季度最后一天的时间戳?

select 
    to_timestamp(
       last_day(
          to_date(
            (left('2021Q4',4)||'-'||int(right('2021Q4',1)*3))||'-'||'1'))) 
from 
   my_table

简单的方法:

select to_timestamp(last_day(concat('2021','-',0,4*3,'-01'))) as last_date_queter

逻辑:

  • 使用 3 的倍数计算季度的最后一个月。例如计算第 4 季度的最后一个月 12 (4*3)
  • concat (year,'-',-01) 这样我们就可以得到相应月份的第一天 2021-12-01
  • last_day 我们可以使用给定日期月份的最后一天。
  • 最后,我们可以将日期转换成时间戳to_timestamp

遗憾的是,Q 无法从字符串格式化为日期对象(它只能反向工作)- 遗憾的是,用 to_date(date, "YYYY'QQ") 解析 Q 不会工作。

根据https://spark.apache.org/docs/latest/sql-ref-datetime-pattern.html“E”、“F”、“q”和“Q”的符号只能用于日期时间格式,例如date_format。它们不允许用于日期时间解析,例如to_timestamp.

因此我们必须将季度和乘以 4 分开。然后将其转换为日期对象(parse_ 并取 last_date 月份:

SELECT
 last_day(
    to_date(
      concat(left("2021Q4", 4), int(right("2021Q4", 1))*3),
      "yyyyMM")
  ) as last_day_of_quarter