Spark SQL如何给日期列减1秒并计算上月末23:59:59时间值
错误点说明
你提供的代码存在以下几处问题:
- 在Spark SQL语句中直接使用
col(cr_date)是错误用法,SQL语法内直接引用字段名即可,不需要用DataFrame API的col()方法 - 解析
cr_date时没有指定输入格式dd.MM.yyyy,会导致日期解析失败返回空值 - 你需要减1秒,原代码写的
minus(60)是减1分钟,参数错误 - 日期输出格式和你预期的
yyyyMMdd'T'HH:mm:ss不匹配 - 往前推2个月最后一天拼接
23:59:59的逻辑没有做格式输出适配
可行实现代码
val df2 = spark.sql(""" select id, cr_date, -- 计算cr_date减1秒,按要求格式化输出 date_format( to_timestamp(cr_date, 'dd.MM.yyyy') - interval 1 second, "yyyyMMdd'T'HH:mm:ss" ) as cr_date_new, rundate, -- 计算rundate往前推2个月的最后一天,拼接23:59:59后格式化 date_format( last_day(add_months(to_date(rundate, 'yyyyMMdd'), -2)), "yyyyMMdd'T'23:59:59" ) as last_date from 你的实际表名 """)
如果你的需求是取rundate的上一个自然月最后一天,把add_months的第二个参数改为-1即可,当前逻辑和你给出的示例输出完全匹配。
内容的提问来源于stack exchange,提问作者user8592197
相关产品推荐
相关产品推荐

