从dbplyr中的日期时间格式中添加/减去日期

gmxoilav  于 2023-04-09  发布在  其他
关注(0)|答案(1)|浏览(120)

我正在使用dbplyr访问数据库中的数据,并试图计算滚动总和金额,其中包括前1年的所有金额。我的日期是dttm格式。我试图获得一个表,显示Start_Date之前的1年,类似于下面:
| 开始日期|过去_1年|
| --------------|--------------|
| 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|
| 2021-07-16 08:26:30|2020-07-16 08:26:30|
| 2021-07-23 07:35:51|2020-07-23 07:35:51|
| 2021-07-30 09:19:13|2020-07-30 09:19:13|
我想从Start_Date中减去1年,以获得每行/观察的滚动一年窗口,用于滚动总和计算。
我以前在dplyr中做过这个,我通常会使用下面的代码来得到这个:

output = df %>%
  mutate(Previous_1year = Start_Date %m+% years(-1))

然而,这个方法似乎与dbplyr和我的数据库不兼容,假设这是因为dbplyr不知道如何将代码转换回SQL。
我还尝试在dbplyr中运行以下代码,这是我在SO中的另一个问题中发现的:

output = df %>%
   mutate(Previous_1year = sql('DATEADD(y, -1, Start_Date)'))

但我得到以下错误,不知道为什么我得到一个无效的日期时间:

! nanodbc/nanodbc.cpp:1752: XX000: [Amazon][Amazon Redshift] (30) 
Error occurred while trying to execute a query: [SQLState XX000] ERROR:  Invalid datetime part for DATEADD().

因为数据太大了,我无法收集所有的数据,并通过dplyr进行数据处理,从我的每个Start_Date观测值中减去1年。所以,希望首先在数据库中进行此操作,这样我就可以在收集结果之前进行计算。

tuwxkamq

tuwxkamq1#

这适用于Postgres,所以可能适用于Redshift:

library(dplyr, warn.conflicts = FALSE)
library(DBI)

pg <- dbConnect(RPostgres::Postgres())

df <- tbl(pg, sql("SELECT '2021-07-02 08:03:29'::timestamp AS start"))
df %>%
  mutate(previous = start - years(1))
#> # Source:   SQL [1 x 2]
#> # Database: postgres  [iangow@/tmp:5432/iangow]
#>   start               previous           
#>   <dttm>              <dttm>             
#> 1 2021-07-02 08:03:29 2020-07-02 08:03:29

创建于2023-04-03带有reprex v2.0.2

相关问题