【问题标题】:Difference in month with TIMESTAMPDIFF mysql function in dbplyr Rdbplyr R中TIMESTAMPDIFF mysql函数的月份差异
【发布时间】:2018-07-12 16:25:47
【问题描述】:

我正在尝试使用 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") 中的错误: 没有适用于“函数”类的对象的“转义”方法

如果这样写:

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

我也会报错:

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

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

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

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

【问题讨论】:

    标签: r dplyr dbplyr


    【解决方案1】:

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

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

    两种可能的解决方案:

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

    【讨论】:

    • 你不接受我的回答。请你给个理由吗?
    • 我们必须使用 dplyr 的 sql 函数来帮助代码翻译 SQL 查询,我已经编辑了你的答案
    • 这是另一种方法,但不是必需的。我原始答案中的示例在我的上下文中按预期工作。我读过的大部分 dbplyr 建议都鼓励用户尽可能避免使用 sql 函数。
    • 没有sql 我得到一个错误:“错误: 'SELECT id_credito, fecha_desem, TIMESTAMPDIFF(MONTH, fecha_desem, CURDATE()) AS @987654336 @ FROM creditos.desembolsos LIMIT 11' nanodbc/nanodbc.cpp:1587: 42000: [MySQL][ODBC 8.0(a) Driver][mysqld-5.6.42]您的 SQL 语法有误;查看对应的手册到您的 MySQL 服务器版本,以便在第 1 行的 'MONTH, fecha_desem, CURDATE()) AS diff_month FROM creditos.desembolsos LIM' 附近使用正确的语法
    • 用硬编码日期替换CURDATE() 是否有效?例如。 '2019 年 6 月 12 日'。如果是这样,这与您最初发布的内容不同。对于这种变化,可能需要sql()
    猜你喜欢
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 2021-06-27
    相关资源
    最近更新 更多