dbplyr在临时表中将字符变为日期格式

时间:2018-02-07 00:21:30

标签: r r-dbi dbplyr

我使用DBI::dbGetQuery将数据提取到SQL Server中的临时表。

即使在真实的查询中(不是下面的播放查询),我 select convert(date, date_value) as date_value,日期仍然存储为字符。

然后我尝试使用lubridate::ymd改变代表日期的字符,但是我收到一条消息说

  

找不到date_value

我也试过,convert(date, date_value)as.Date无济于事。

require(dplyr)
if (dbExistsTable(con, "##temp", catalog_name = "tempdb")){
  dbRemoveTable(con, "##temp")
}
DBI::dbGetQuery(con, paste(              
"select 
    convert(date, '2013-05-25') as date_value
into ##temp
"))

tbl(con, "##temp")

# Error - date_value not found
tbl(con, "##temp") %>%   mutate(date_value= lubridate::ymd(date_value))

# this works
tbl(con, "##temp") %>%   mutate(temp= date_value) 

# this doesn't work - date value not found
tbl(con, "##temp") %>%   mutate(temp= lubridate::ymd(date_value))

如何将此字段用作日期?

注意:当我在SQL Server中编写以下内容时,date_value显示为日期类型

select 
convert(date, '2013-05-25') as date_value
into #hello

select *
from #hello

exec tempdb..sp_help #hello

在回应@Kevin Arseneau的评论时,下图显示了执行show_query()的结果 error message

1 个答案:

答案 0 :(得分:2)

几个月前,我在PostgreSQL上寻找使用lubridate函数+ dplyr的解决方案失败了。无意中,我发现了直接在dbplyr编码上使用DBMS功能的简单解决方案。

抱歉,我将使用PostgreSQL示例,因为我不了解SQL服务器功能。在这个例子中,我将在PostgreSQL DBMS中创建一个时态表,然后我将使用PostgreSQL提供的函数to_date()计算一个新列。结果是正在寻找的日期:

# Easy example on postgreSQL
library(tidyverse)
library(dbplyr)
library(RPostgreSQL)

con <- dbConnect(PostgreSQL(), 
                 dbname="postgre",
                 host="localhost",
                 port=5432,
                 user="user",
                 password="pass")

date <- data_frame(date_str = c("20180212", "20180213"))

dbWriteTable(con, "tmp", date, temporary = TRUE)

tbl(con, "tmp") %>% 
# The DBMS function is used here
  mutate(date = to_date(date_str, "YYYYMMDD")) %>% 
# Finally, I collect the data from database to R session
  collect()

#># A tibble: 2 x 3
#>  row.names date_str date      
#>* <chr>     <chr>    <date>    
#>1 1         20180212 2018-02-12
#>2 2         20180213 2018-02-13

您可以尝试使用SQL Server的设置,CAST()功能可以将字符串转换为日期,如此answer中所述。我希望这能帮到你。

我希望有一天dplyr/dbplyr可以将lubridate函数转换为SQL个查询。