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

AWS Athena (Trino SQL) Convert birthdate string (mm/dd/yy) to date -- need twentieth century

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

我发现了类似的问题,但它们要么不是特定于 Athena,要么不是特定于生日的两位数日期格式(例如 56 应映射到 1956)

类似问题的一个例子(这个是4年的日期是):

例如,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函数returns一个时间戳对象,参见文档:https://prestodb.io/docs/current/functions/datetime.html

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

For parsing with the abbreviated year pattern ("y" or "yy"), SimpleDateFormat must interpret the abbreviated year relative to some century. It does this by adjusting dates to be within 80 years before and 20 years after the time the SimpleDateFormat instance is created.