AWS Athena字符串转时间戳报错,求问题排查及解决方法
嘿,我来帮你搞定这个Athena时间转换的问题!
你遇到的错误根源是Athena用的是Presto的日期解析规则,但你用的%i(分钟)和%r(12小时制时间)是MySQL的格式符,Presto根本不认识这些,所以才会报错。
先给你直接的解决方案,针对你的string_time格式(比如2020-12-07 11:00:02 AM -06:00、2020-12-07 2:54:46 PM -06:00),正确的解析语句应该是:
parse_datetime(string_time, '%Y-%m-%d %l:%M:%S %p %:z')
我给你拆解下这个格式符的含义,避免再踩坑:
%Y: 4位年份(比如2020)%m: 2位月份(01-12)%d: 2位日期(01-31)%l: 12小时制的小时(1-12,支持不带前导零的情况,比如你的第二个例子里的2)%M: 2位分钟(00-59,这就是你之前用%i想要实现的效果)%S: 2位秒数(00-59)%p: AM/PM标识(大小写都兼容)%:z: 带冒号的时区偏移(比如-06:00,如果是不带冒号的-0600就用%z)
另外,你之前用substr截取前22位其实没必要,保留完整的时区信息能让时间转换更准确,毕竟不同时区的时间计算会有差异。
举两个测试例子验证下:
- 解析
2020-12-07 11:00:02 AM -06:00:parse_datetime('2020-12-07 11:00:02 AM -06:00', '%Y-%m-%d %l:%M:%S %p %:z')会返回带时区的时间戳 - 解析
2020-12-07 2:54:46 PM -06:00:同样的格式也能正确识别不带前导零的小时数
最后提醒下:Presto的日期格式符和MySQL、Java的都有差异,比如Presto里%m是月份,%M才是分钟,别搞混啦!
内容的提问来源于stack exchange,提问作者dpt
相关产品推荐
相关产品推荐

