【问题标题】:Add postgres time interval using dplyr/dbplyr使用 dplyr/dbplyr 添加 postgres 时间间隔
【发布时间】:2018-01-21 22:19:14
【问题描述】:

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

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

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

【问题讨论】:

    标签: r postgresql dplyr dbplyr


    【解决方案1】:

    根据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
    

    【讨论】:

      猜你喜欢
      • 2018-10-08
      • 1970-01-01
      • 2021-03-18
      • 2020-09-28
      • 2014-08-21
      • 2011-01-20
      • 1970-01-01
      • 2010-10-31
      相关资源
      最近更新 更多