0

我正在尝试使用 dbplyr 包计算 R 中两个日期之间的月差,我想发送 sql 查询以使用 mysql 中的“timestampdiff”本机函数计算它,但出现错误:

library(tidyverse)
library(lubridate)
library(dbplyr)     

        db_df <- tbl(con, "creditos")

        db_df %>% mutate(diff_month = timestampdiff(month, column_date_1, column_date_2))

但参数month没有被正确翻译,因为它看起来像 R 中的对象或函数:

UseMethod(“escape”)中的错误:没有适用于“escape”的方法应用于“function”类的对象

如果这样写:

db_df %>% mutate(diff_month = timestampdiff("month", column_date_1, column_date_2))

我也会得到一个错误:

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以了解在month, column_date_1, column_date_2) AS附近使用的正确语法diff_month

我相信这是因为 dbplyr 正在将带有双引号的“月”写入 mysql,它应该没有双引号,如下所示:

TIMESTAMPDIFF(month, column_date_1, column_date_2) AS `diff_month`

或者有没有更好的方法来使用 dbplyr 计算月差?

4

1 回答 1

0

monthlubridate包中的一个函数。看起来 mutatemonth作为 R 函数month()而不是文本传递。

如果您使用本机 SQL 来计算时差,那么您应该不需要 lubridate 包。

两种可能的解决方案:

  1. library(lubridate)从您的序言中删除并使用lubridate前缀引用包lubridate::。例如:lubridate::ymd_hms
  2. 将要在本机 SQL 中运行的 mutate 命令部分大写。这应该有助于 SQL 翻译将它们与具有其他含义的小写变体区分开来。例如: db_df %>% mutate(diff_month = TIMESTAMPDIFF(MONTH, column_date_1, column_date_2))
于 2018-09-22T20:00:59.097 回答