You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS Athena字符串时间分组Case When语法及解析问题求助

AWS Athena字符串时间字段分组时间区间的问题与解决

我刚学习AWS Athena,想要将字符串类型的时间字段分组为时间区间桶,但Case When语句运行异常:

  • 初始查询因varchar类型无法与timestamp类型比较报错
  • 修改查询后,在Amazon QuickSight中又出现数据包含无效日期/数字的解析错误

初始查询代码

Select 
Case time
WHEN time between date_parse('12:00:00 AM','%h:%i:%s %p') AND date_parse('03:00:00 AM','%h:%i:%s %p') Then '12AM - 3AM'
WHEN time between date_parse('03:00:00 AM','%h:%i:%s %p') AND date_parse('06:00:00 AM','%h:%i:%s %p') Then '3AM - 6AM'
WHEN time between date_parse('12:00:00 AM','%h:%i:%s %p') AND date_parse('12:00:00 AM','%h:%i:%s %p') Then '6AM - 9AM'
WHEN time between date_parse('12:00:00 AM','%h:%i:%s %p') AND date_parse('12:00:00 AM','%h:%i:%s %p') Then '9AM - 12AM'
WHEN time between date_parse('12:00:00 AM','%h:%i:%s %p') AND date_parse('12:00:00 AM','%h:%i:%s %p') Then '12PM - 3PM'
WHEN time between date_parse('12:00:00 AM','%h:%i:%s %p') AND date_parse('12:00:00 AM','%h:%i:%s %p') Then '3PM - 6PM'
WHEN time between date_parse('12:00:00 AM','%h:%i:%s %p') AND date_parse('12:00:00 AM','%h:%i:%s %p') Then '6PM - 9PM'
WHEN time between date_parse('12:00:00 AM','%h:%i:%s %p') AND date_parse('12:00:00 AM','%h:%i:%s %p') Then '9AM - 12AM'
END AS
Time_Intervals
From "another_db"."clean_crime_data" Order by time limit 10;

初始报错信息

SYNTAX_ERROR: line 3:11: Cannot check if varchar is BETWEEN timestamp and timestamp


修改后查询代码

Select 
Case 
WHEN date_parse(time,'%h:%i:%s %p') between date_parse('12:00:00 AM','%h:%i:%s %p') AND date_parse('03:00:00 AM','%h:%i:%s %p') Then '12AM - 3AM'
WHEN date_parse(time,'%h:%i:%s %p') between date_parse('03:00:00 AM','%h:%i:%s %p') AND date_parse('06:00:00 AM','%h:%i:%s %p') Then '3AM - 6AM'
WHEN date_parse(time,'%h:%i:%s %p') between date_parse('12:00:00 AM','%h:%i:%s %p') AND date_parse('12:00:00 AM','%h:%i:%s %p') Then '6AM - 9AM'
WHEN date_parse(time,'%h:%i:%s %p') between date_parse('12:00:00 AM','%h:%i:%s %p') AND date_parse('12:00:00 AM','%h:%i:%s %p') Then '9AM - 12AM'
WHEN date_parse(time,'%h:%i:%s %p') between date_parse('12:00:00 AM','%h:%i:%s %p') AND date_parse('12:00:00 AM','%h:%i:%s %p') Then '12PM - 3PM'
WHEN date_parse(time,'%h:%i:%s %p') between date_parse('12:00:00 AM','%h:%i:%s %p') AND date_parse('12:00:00 AM','%h:%i:%s %p') Then '3PM - 6PM'
WHEN date_parse(time,'%h:%i:%s %p') between date_parse('12:00:00 AM','%h:%i:%s %p') AND date_parse('12:00:00 AM','%h:%i:%s %p') Then '6PM - 9PM'
WHEN date_parse(time,'%h:%i:%s %p') between date_parse('12:00:00 AM','%h:%i:%s %p') AND date_parse('12:00:00 AM','%h:%i:%s %p') Then '9AM - 12AM'
END AS
Time_Intervals
From "another_db"."clean_crime_data" Order by time limit 10;

修改后报错信息(翻译)

Amazon QuickSight无法解析数据,因为其中包含无效日期或无效数字。请确保您的数据仅包含受支持的数字和日期格式。


解决方案

1. 修复时间区间的参数错误

你修改后的查询里,大部分区间的date_parse参数都是复制粘贴的'12:00:00 AM',这是核心错误。要把每个区间的起止时间补全正确,比如:

  • 6AM-9AM对应date_parse('06:00:00 AM','%h:%i:%s %p')和date_parse('09:00:00 AM','%h:%i:%s %p')
  • 9AM-12PM对应date_parse('09:00:00 AM','%h:%i:%s %p')和date_parse('12:00:00 PM','%h:%i:%s %p')

2. 用try_date_parse替代date_parse处理无效数据

date_parse在遇到不符合格式的字符串时会直接报错,而try_date_parse会返回NULL,避免查询失败,同时兼容QuickSight的解析要求:

WHEN try_date_parse(time,'%h:%i:%s %p') between date_parse('12:00:00 AM','%h:%i:%s %p') AND date_parse('03:00:00 AM','%h:%i:%s %p') Then '12AM - 3AM'

3. 优化查询逻辑,减少重复解析

用子查询先统一转换时间,再做区间判断,代码更清晰且减少计算量:

SELECT
  CASE
    WHEN parsed_time BETWEEN date_parse('12:00:00 AM','%h:%i:%s %p') AND date_parse('03:00:00 AM','%h:%i:%s %p') THEN '12AM - 3AM'
    WHEN parsed_time BETWEEN date_parse('03:00:00 AM','%h:%i:%s %p') AND date_parse('06:00:00 AM','%h:%i:%s %p') THEN '3AM - 6AM'
    WHEN parsed_time BETWEEN date_parse('06:00:00 AM','%h:%i:%s %p') AND date_parse('09:00:00 AM','%h:%i:%s %p') THEN '6AM - 9AM'
    WHEN parsed_time BETWEEN date_parse('09:00:00 AM','%h:%i:%s %p') AND date_parse('12:00:00 PM','%h:%i:%s %p') THEN '9AM - 12PM'
    WHEN parsed_time BETWEEN date_parse('12:00:00 PM','%h:%i:%s %p') AND date_parse('03:00:00 PM','%h:%i:%s %p') THEN '12PM - 3PM'
    WHEN parsed_time BETWEEN date_parse('03:00:00 PM','%h:%i:%s %p') AND date_parse('06:00:00 PM','%h:%i:%s %p') THEN '3PM - 6PM'
    WHEN parsed_time BETWEEN date_parse('06:00:00 PM','%h:%i:%s %p') AND date_parse('09:00:00 PM','%h:%i:%s %p') THEN '6PM - 9PM'
    WHEN parsed_time BETWEEN date_parse('09:00:00 PM','%h:%i:%s %p') AND date_parse('12:00:00 AM','%h:%i:%s %p') THEN '9PM - 12AM'
    ELSE '无效时间'
  END AS Time_Intervals
FROM (
  SELECT try_date_parse(time,'%h:%i:%s %p') AS parsed_time
  FROM "another_db"."clean_crime_data"
) t
ORDER BY parsed_time
LIMIT 10;

4. 排查无效时间数据

先找出无法解析的时间字符串,针对性清洗或调整解析格式:

SELECT time
FROM "another_db"."clean_crime_data"
WHERE try_date_parse(time,'%h:%i:%s %p') IS NULL;

内容的提问来源于stack exchange,提问作者user15564501

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 03:40:22