spark sql 生成指定区间的日期

spark sql生成指定连续区间的日期,如 2021-12-29 到 2021-12-31 之间的日期, 也可指定具体的开始和结束日期,只需修改开始时间和结束时间即可

spark sql 生成指定区间的日期_第1张图片

    spark.sql(
      """
        |select date_add(date_add(end_date, diff), a.pos) as date
        |from
        | (
        |	  select posexplode(split(repeat(" ", datediff(end_date, date_add(end_date, diff))), " ")),
        |           end_date,
        |           diff
        |   from
        |     (
        |       select start_date, end_date, datediff(start_date,end_date) diff from
        |           (
        |             select '2021-12-29' as start_date,'2021-12-31' as end_date
        |           )
        |     )
        | )a
        |""".stripMargin).show()

 spark sql 生成指定区间的日期_第2张图片

 想要生成一张这样的日期维表,其中 E 列表上的这一天是在这个月的第几周,也就是月周数,想要求得该天是该月的第几周可以使用

用该天的年周数,减去该月 月初那天的年周数,再加一,就可以得到月周数

可以使用 weekofyear 获取年周数

 但是由于 weekofyear 获取的时候 如果该年的第一天是在周五、周六、周日 这三天,weekofyear 就会把这一年的第一天划分到上一年的最后一天的那个年周数里

select weekofyear("2022-01-01") 

+------------------------------------+
|weekofyear(CAST(2022-01-01 AS DATE))|
+------------------------------------+
|                                  52|
+------------------------------------+

但是可以通过判断该年的第一天是否属于周五、六、日来做选择

select 7- datediff(next_day('2022-01-01','Sunday'),'2022-01-01') week_name

spark sql 生成指定区间的日期_第3张图片

如果是该年第一天是 5,6,0(周日)【这样的年标记为Y】 的话 年周数直接给1,如果是Y这样的年的话且是一月份的话, 就不可以直接使用weekofyear,第一周给1,第二周需要给 1月1号的下一周的任意一天,可以给定是1月6号 作为年周数,因为需要取  月初那天的年周数  ,其他月份的年周数再加1 ,也就是weekofyear(date)+ 1 ,

如果不是这样的年就直接取 weekofyear(date)

同理, 12月份的last day在1 2 3的话,他所在的那周也是有问题的在使用weekofyear的时候,也需要特殊处理

spark sql 生成指定区间的日期_第4张图片

你可能感兴趣的:(bigData,spark,sql)