我在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
这样做的正确方法是什么?
答案 0 :(得分:3)
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