为什么我的日期字段作为double等从SQL数据库返回到R.

时间:2017-08-24 01:17:14

标签: sql r dplyr dbplyr

测试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寻求以上任何一点的帮助

1 个答案:

答案 0 :(得分:0)

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

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