使用dplyr / dbplyr添加postgres时间间隔

时间:2018-01-21 22:19:15

标签: r postgresql dplyr dbplyr

我在R中有一个数据库连接,并想在Postgres中实现以下过滤步骤---使用dplyr(v0.5):

WHERE time1 < time2 - INTERVAL '30 minutes'

(见https://www.postgresql.org/docs/9.1/static/functions-datetime.html

我尝试了以下(这是我将为POSIX对象做的)但收到此错误:

tbl(con, 'data') %>%
  filter(time1 < time2 - 30 * 60) %>%
  collect()
# ERROR: operator does not exist: timestamp without timezone - numeric

这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

根据SQL translation vignette

  

dplyr不知道如何转换的任何函数都保留原样。   这意味着dplyr未涵盖的数据库函数可以   可以通过translate_sql()直接使用。

但是你不能使用%interval%,因为在R中你的条件在语法上是不正确的:

time1 < time2 - %interval% "30 minutes"
# Error: unexpected SPECIAL in "time1 < time2 - %interval%"

使用interval并不是更好:

time1 < time2 - interval "30 minutes"
# Error: unexpected string constant in "time1 < time2 - interval "30 minutes""

但是以下技巧确实有效:

dbplyr::translate_sql(time1 < time2 %- interval% "30 minutes")
# <SQL> "time1" < "time2" - INTERVAL '30 minutes'

所以这段代码应该回答你的问题:

tbl(con, "data") %>%
  filter(time1 < time2 %- interval% "30 minutes") %>%
  collect