SparkSQL获取当月最后一天时如何保留Timestamp的时间部分?
解决方案
要在获取当月最后一天的同时保留Timestamp的时间部分,核心是将last_day()得到的当月最后一天日期,与原始Timestamp的时分秒部分组合起来,以下是两种可行的实现方式:
方法1:拼接日期与时间字符串后转Timestamp
利用date_format()提取原始时间的时分秒部分,与last_day()返回的日期拼接后转成Timestamp:
spark.sql("SELECT DISTINCT max(col1) AS col1, \ col2, col3,\ max(col4) AS col4,\ to_timestamp(concat(last_day(col5_date), ' ', date_format(col5_date, 'HH:mm:ss'))) as col5_date\ FROM table \ GROUP BY col1, col2, col3, col4, col5").registerTempTable("table1")
方法2:通过时间戳差值计算
先计算原始Timestamp当天已流逝的秒数,再将该秒数加到当月最后一天的起始时间上:
spark.sql("SELECT DISTINCT max(col1) AS col1, \ col2, col3,\ max(col4) AS col4,\ timestamp_add(to_timestamp(last_day(col5_date)), unix_timestamp(col5_date) - unix_timestamp(date_trunc('day', col5_date))) as col5_date\ FROM table \ GROUP BY col1, col2, col3, col4, col5").registerTempTable("table1")
补充说明
两种方法都能保留原始Timestamp的时分秒信息,仅将日期部分替换为当月最后一天。另外注意你的GROUP BY子句中包含col5,需确保该分组逻辑符合业务需求。
内容的提问来源于stack exchange,提问作者Wendy Velasquez
相关产品推荐
相关产品推荐

