我目前正在使用 AWS Athena,我希望将字符串字段“YYYYMM”转换为日期(即“202208”到 2022-08-dd),并将日期 (dd) 定义为该日期的最后一天月。我首先将字符串转换为日期,然后需要在顶部应用一个函数将其转换为该月的最后一天(通常默认情况下,日期将设置为该月的第一天)。
我正在查看 Presto 文档 ( https://prestodb.io/docs/current/functions/datetime.html ),并遇到了 MySQL Str_to_date 函数的部分,但是,当我尝试在 Athena 中运行以下代码时收到错误。
SELECT
MONTH,
STR_TO_DATE(CONCAT(MONTH,'01'),'%Y%m%d')
FROM db.table
WHERE MONTH IN ('202208')
Athena 上的错误消息是该函数未注册“SYNTAX_ERROR:第 3:1 行:函数 str_to_date 未注册”
。
我现在已经使用了 date_parse 函数来进行转换,但是,输出中有一个时间戳。虽然它不会影响我随后运行报告的方式,但有没有办法删除时间戳?
SELECT
MONTH,
date_parse((Month),'%Y%m')
FROM db.table
WHERE MONTH IN ('202208')
上述输出为 2022-08-01 00:00:00.000
我的下一步是将此输出日期转换为该月的最后一天。我尝试应用月份的最后一天函数,但不支持。 MySQL 的替代方案是什么?是否有支持此功能的函数,或者我应该使用日期截断进行数学计算?
SELECT
MONTH,
last_day_of_month(date_parse((Month),'%Y%m'))
FROM db.table
WHERE MONTH IN ('202208')
谢谢
最佳答案
本质上与 other answer 中提出的解决方案类似,但嵌套较少。
SELECT
DATE_PARSE(dt, '%Y%m') + INTERVAL '1' month - INTERVAL '1' day last_day_of_month
FROM (SELECT '202208' dt) t
-- outputs
last_date
2022-08-31 00:00
DATE_PARSE(<field>, '%Y%m')
是 athena 中的有效日期格式,并将解析为该月的第一个日期。
添加 interval '1' month
然后删除 interval '1' day
产生该月的最后一个日期。您可以删除任何其他较短的间隔,例如,如果删除 '1' second
,你最终会得到时间 2022-08-31 23:59:59.000
.
I have now used the date_parse function which does the conversion, however, there is a timestamp in the output. Although it won't impact how I then run reports on the back of this is there a way to remove the timestamp?
是的。您可以将 timestamp
转换为到 date
通过将值传递给 DATE
即可轻松完成功能。见下文。
SELECT
DATE(DATE_PARSE(dt, '%Y%m') + INTERVAL '1' month - INTERVAL '1' day) last_day_of_month
FROM (SELECT '202208' dt) t
关于mysql - Amazon Athena 将字符串转换为日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73961641/