dbplyr中dttm格式日期减1年的适配问题(Redshift环境)
解决dbplyr访问Redshift时的日期减一年问题
错误原因
你遇到的Invalid datetime part for DATEADD()错误,是因为Amazon Redshift的DATEADD函数不支持年份的缩写y,必须使用完整的日期部分标识符year。
解决方案
以下两种方法都能在数据库端完成计算,无需拉取全量数据到本地:
方法1:修正原生SQL片段
直接使用Redshift支持的DATEADD语法:
output = df %>% mutate(Previous_1year = sql('DATEADD(year, -1, Start_Date)'))
方法2:使用dbplyr兼容的函数(推荐)
使用dbplyr内置的add_months函数,通过减去12个月实现减一年的效果,这种写法更符合dplyr风格,且无需手写原生SQL:
output = df %>% mutate(Previous_1year = add_months(Start_Date, -12))
该代码会被dbplyr自动转译为Redshift兼容的SQL:DATEADD(month, -12, Start_Date),最终结果和直接减一年完全一致。
验证效果
两种方法都会为每条记录生成符合预期的Previous_1year字段,示例结果如下:
| Start_Date | Previous_1year |
|---|---|
| 2021-07-02 08:03:29 | 2020-07-02 08:03:29 |
| 2021-07-09 06:36:28 | 2020-07-09 06:36:28 |
| 2021-07-09 09:29:02 | 2020-07-09 09:29:02 |
内容的提问来源于stack exchange,提问作者winlai
相关产品推荐
相关产品推荐

