微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

AWS Athena (Trino SQL) 将生日字符串 (mm/dd/yy) 转换为日期——需要二十世纪

如何解决AWS Athena (Trino SQL) 将生日字符串 (mm/dd/yy) 转换为日期——需要二十世纪

AWS Athena (Trino) 将生日字符串 (mm/dd/yy) 转换为日期 -- 需要二十世纪

我发现了类似的问题,但它们不是针对 Athena,也不是针对出生日期的两位数日期格式(例如 56 应该映射到 1956)

类似问题的一个例子(这个是 4 年的日期是): Amazon Athena Convert String to Date

例如,cast( date_parse(trim("date of birth"),'%m/%d/%Y') as date ) as our_date_of_birth 给出了可笑的:0094-01-04 而不是 1994 年的日期

但是,如果我使用: cast( date_parse(trim("date of birth"),'%m/%d/%y') as date ) as our_date_of_birth, 它有时会给我正确的日期,但有时会像:2062-07-31 而不是 1962

最后,简单地说:

cast( trim("date of birth") as date ) as our_date_of_birth

给出错误:INVALID_CAST_ARGUMENT:无法将值转换为日期:10/11/78

有没有办法从 Athena Trino 中的这些演员表中获得 20 世纪的生日? 显然会有一些边缘情况,例如 01/01/20 可以映射到 1920 或 2020,但是像 01/01/50 这样的日期肯定应该映射到 1950。

样本数据和输出

01/01/56 -- output would be 1956-01-01 as date
01/01/08 -- output would be 2008-01-01 as date
01/01/21 -- output would be 2021-01-01 as date (* some would want 1921 here)
07/01/21 -- output would be 1921-07-01 as date (since as of posting 07/01/2021 would be in future)

**The outuput format isn't crucial,it Could be 01/01/1956,just so it is a true 'date' in Athena Trino.**

解决方法

一种方法是在解析日期是未来时减去 100 年。例如:

select case when 
         parse_datetime(birthdate,'MM/dd/yy') > current_timestamp then
                    parse_datetime(birthdate,'MM/dd/yy') - interval '100' year 
         else parse_datetime(birthdate,'MM/dd/yy') 
       end as birthdate

请注意,这只能持续到下个世纪。

parse_datetime 函数返回时间戳对象,请参阅文档:https://prestodb.io/docs/current/functions/datetime.html

parse_datetime 使用 java 的 DateFormat 约定。从文档: https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

为了使用缩写年份模式(“y”或“yy”)进行解析,SimpleDateFormat 必须解释相对于某个世纪的缩写年份。它通过将日期调整为创建 SimpleDateFormat 实例之前 80 年和之后 20 年内来实现这一点。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。