3

我在 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

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

4

1 回答 1

3

根据SQL 翻译小插图

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
于 2018-01-29T15:42:00.350 回答