为什么我的日期字段从 SQL 数据库作为 double 等返回到 R
Why is my date field being returned into R from SQL database as a double etc
正在测试 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 就以上任何一点寻求帮助
这是因为,到今天为止,months()
向量函数在 dbplyr
中还没有针对 MSSQL 的翻译。 dplyr
翻译工作的好处在于它可以让您调用数据库本机命令,在 MSSQL 中,DATENAME 函数应该可以满足您的需要。此代码应该有效:
df.out %>%
mutate(month=datename(month, gameDate))
正在测试 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 就以上任何一点寻求帮助
这是因为,到今天为止,months()
向量函数在 dbplyr
中还没有针对 MSSQL 的翻译。 dplyr
翻译工作的好处在于它可以让您调用数据库本机命令,在 MSSQL 中,DATENAME 函数应该可以满足您的需要。此代码应该有效:
df.out %>%
mutate(month=datename(month, gameDate))