Amazon Athena中varchar类型分区列dt无法与日期执行BETWEEN比较的解决方案咨询
解决Athena中VARCHAR日期字符串转换与比较的问题
你遇到的核心问题是字符串类型的日期无法直接和DATE类型做范围比较,而且Athena(基于Presto/Trino)不支持str_to_date函数,之前用date_parse没成功大概率是格式匹配串写错了。下面给你两种可行的解决方案:
方法1:用date_parse正确匹配格式
你的dt字段格式是yyyy/MM/dd/HH(比如2020/12/11/20),需要用完全匹配的格式串'%Y/%m/%d/%H'来解析。date_parse会返回TIMESTAMP类型,它可以直接和DATE类型做比较(Athena会自动处理隐式转换)。
修改后的完整查询语句:
SELECT DATE_FORMAT(date_parse(dt, '%Y/%m/%d/%H'), '%Y-%m') as dt, count(*) as "total_visualization", count(*)/cast(date_format(DATE '2022-08-08', '%d') as integer) as "average_day" FROM user.dashborad WHERE event = 'complete' AND date_parse(dt, '%Y/%m/%d/%H') BETWEEN DATE '2022-08-01' and DATE '2022-08-08' GROUP BY 1;
如果你的dt格式有特殊情况(比如月份是一位数),可以调整格式串,比如用%c代替%m表示不带前导零的月份。
方法2:字符串截取+替换转换日期
如果dt的前10位固定是yyyy/mm/dd(比如2020/12/11/20的前10位是2020/12/11),也可以通过字符串操作转换成标准日期格式后再CAST:
SELECT DATE_FORMAT(cast(replace(substr(dt, 1, 10), '/', '-') as date), '%Y-%m') as dt, count(*) as "total_visualization", count(*)/cast(date_format(DATE '2022-08-08', '%d') as integer) as "average_day" FROM user.dashborad WHERE event = 'complete' AND cast(replace(substr(dt, 1, 10), '/', '-') as date) BETWEEN DATE '2022-08-01' and DATE '2022-08-08' GROUP BY 1;
这种方法更直观,适合格式非常固定的场景。
为什么之前的尝试失败?
str_to_date不是Athena支持的函数,Athena遵循Presto的函数规范,日期解析主要用date_parse或者from_iso8601_timestamp(后者适合ISO格式)。- 你之前用
date_parse没成功,应该是格式串和dt的实际格式不匹配,必须保证格式串的分隔符、占位符完全对应字段内容。
内容的提问来源于stack exchange,提问作者Vivianne Miranda
相关产品推荐
相关产品推荐

