Amazon Athena将YYYYMM字符串转为月末日期的技术咨询
AWS Athena 日期转换问题解决方案
1. 关于STR_TO_DATE报错的原因
AWS Athena基于Trino(原Presto)构建,不支持MySQL的STR_TO_DATE函数,必须使用Trino兼容的日期处理函数,比如date_parse或date_from_parts。
2. 去除date_parse返回的时间戳
date_parse默认返回timestamp类型(带时分秒),只需用date()函数包裹转换结果,就能得到纯日期格式:
SELECT MONTH, date(date_parse(MONTH, '%Y%m')) AS month_first_day FROM db.table WHERE MONTH IN ('202208')
执行后输出为2022-08-01,无时间戳后缀。
3. 转换为当月最后一天(替代不支持的last_day_of_month)
Athena原生不支持last_day_of_month,但有两种可靠的替代方案:
方案一:日期偏移计算(兼容所有Athena版本)
先将日期转为下月第一天,再减1天,即可得到当月最后一天:
SELECT MONTH, date(date_add('day', -1, date_add('month', 1, date_parse(MONTH, '%Y%m')))) AS month_last_day FROM db.table WHERE MONTH IN ('202208')
逻辑拆解:
date_parse(MONTH, '%Y%m'):把YYYYMM字符串转为当月1日的时间戳date_add('month', 1, ...):给日期加1个月,得到下月1日date_add('day', -1, ...):减1天,得到当月最后一天date():去除时间戳,保留纯日期格式
方案二:使用last_day函数(仅限Athena v3及以上版本)
如果你的Athena是v3版本,直接用内置的last_day函数更简洁:
SELECT MONTH, date(last_day(date_parse(MONTH, '%Y%m'))) AS month_last_day FROM db.table WHERE MONTH IN ('202208')
完整整合示例
把所有需求合并的最终SQL:
SELECT MONTH, date(date_parse(MONTH, '%Y%m')) AS month_first_day, date(date_add('day', -1, date_add('month', 1, date_parse(MONTH, '%Y%m')))) AS month_last_day FROM db.table WHERE MONTH IN ('202208')
内容的提问来源于stack exchange,提问作者Patty
相关产品推荐
相关产品推荐

