【问题标题】:Why is my date field being returned into R from SQL database as a double etc为什么我的日期字段作为双重等从 SQL 数据库返回到 R
【发布时间】:2018-02-01 17:44:28
【问题描述】:

测试 dbplyr 和与数据库的连接,并获得以双精度形式返回的日期

con <- DBI::dbConnect(RSQLite::SQLite(), ":memory:")

df.in <- data.frame(count = c(1:2),Date = as.Date(rep(0,2), origin = "1900-
01-01"),stringsAsFactors = FALSE)
str(df.in)
# 'data.frame': 2 obs. of  2 variables:
#  $ count: int  1 2
#  $ Date : Date, format: "1900-01-01" "1900-01-01"

DBI::dbWriteTable(con, "df.in", df.in, overwrite=TRUE)
df.out<- dplyr::tbl(con, "df.in") 
str(df.out)
# List of 2
#  $ src:List of 2
#   ..$ con  :Formal class 'SQLiteConnection' [package "RSQLite"] with 6 
slots
#   .. .. ..@ ptr                :<externalptr> 
#   .. .. ..@ dbname             : chr ":memory:"
#   .. .. ..@ loadable.extensions: logi TRUE
#   .. .. ..@ flags              : int 70
#   .. .. ..@ vfs                : chr ""
#   .. .. ..@ ref                :<environment: 0x00000000137b7dc0> 
#   ..$ disco: NULL
#   ..- attr(*, "class")= chr [1:3] "src_dbi" "src_sql" "src"
#  $ ops:List of 2
#   ..$ x   :Classes 'ident', 'character'  chr "df.in"
#   ..$ vars: chr [1:2] "count" "Date"
#   ..- attr(*, "class")= chr [1:3] "op_base_remote" "op_base" "op"
#  - attr(*, "class")= chr [1:4] "tbl_dbi" "tbl_sql" "tbl_lazy" "tbl"

df.out
# Source:   table<df.in> [?? x 2]
# Database: sqlite 3.19.3 [:memory:]
#   count   Date
#   <int>  <dbl>
# 1     1 -25567
# 2     2 -25567

a) df.out 是一个列表。查看返回的基础数据的最佳方法是什么,即 data.frame 或 tbl 格式的计数和日期

b) 为什么返回的是双精度而不是日期

c) 当我遇到这个问题时,我无法复制我的初始问题(使用 MS SQL 服务器连接),即在数据上使用 dplyr 代码时 - 其中 gameDate 已被确认为日期字段 - 到做一个突变我得到这个错误

df.out %>%
  mutate(month=months(gameDate))

# nanodbc/nanodbc.cpp:1587: 42000: [Microsoft][SQL Server Native Client 
11.0][SQL Server]'MONTHS' is not a recognized built-in function name. 

反正有这个。我认为 dbplyr 将 dplyr 代码翻译成适当的 SQL

TIA 就上述任何一点寻求帮助

【问题讨论】:

    标签: sql r dplyr dbplyr


    【解决方案1】:

    这是因为,截至今天,months() 向量函数在dbplyr 中还没有针对 MSSQL 的翻译。 dplyr 翻译工作的好处是它可以让你调用数据库本地命令,在 MSSQL 中,DATENAME 函数应该满足你的需要。这段代码应该可以工作:

    df.out %>% mutate(month=datename(month, gameDate))

    【讨论】:

    • 感谢您的回复。我不是 SQL 连接方面的专家,但有几点 a) 这不是 SQLiteConnection 吗? b) 当我建立与 MSSQL 的连接时:Formal class 'Microsoft SQL Server' 代码运行时没有错误,但当我运行 df.out 时出现此错误 Error: 'SELECT TOP 1000 " count", "Date", DATENAME('month', "gameDate") AS "month" FROM "df.in"' nanodbc/nanodbc.cpp:1587: 42000: [Microsoft][SQL Server Native Client 11.0][SQL服务器]为日期名称指定的参数 1 无效。
    • 对,这不是 SQLite 连接,我关注的是您的原始问题,即 MS SQL 中的日期转换。我认为引用月份是运行 df.in 时的问题。让我们试试这个:df.out %>% mutate(month=datename(month, gameDate))
    • 谢谢你的作品。不确定协议。我应该编辑你的答案还是你会这样做另外,是否有其他可用功能的列表尚未为 MSSQL 翻译,以及预计无缝连接的时间。这将帮助我决定是否将项目搁置一段时间
    • 感谢您指出,我只是在原始评论中修复了它。查看今天可用列表的最佳方法是查看实际代码,这是dbplyr 中的 MSSQL 翻译链接:github.com/tidyverse/dbplyr/blob/master/R/db-odbc-mssql.R
    • 感谢您的链接。例如,我刚刚尝试了 head() 和 tail()。前者可以,后者不行。我将运行我的代码,看看它是如何进行的
    猜你喜欢
    • 2010-11-13
    • 2020-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多