在RSQLite中筛选日期列无效,求排查问题原因
问题原因
当你使用extended_types = TRUE连接SQLite时,RSQLite会将R的Date类型(由ymd()生成)以Julian日的整数形式存储在数据库中,而非你预期的ISO格式字符串。因此,用字符串'2019-01-01'或date('2019-01-01')(返回字符串)去匹配整数类型的列值,自然无法得到结果。
解决方法
你可以任选以下一种方式解决:
方法1:查询时转换为Julian日整数
在SQL语句中使用julianday()函数将日期字符串转换为对应的整数,与存储的列值匹配:
dbSendQuery(test_db, "SELECT * FROM df WHERE date_col = julianday('2019-01-01')") %>% dbFetch()
方法2:关闭extended_types参数
连接数据库时去掉extended_types = TRUE,此时R的Date类型会以ISO格式字符串存储,直接用字符串筛选即可生效:
test_db <- dbConnect(RSQLite::SQLite(), "") df <- tibble(date_col = ymd(c("2018-01-01", "2019-01-01"))) dbWriteTable(test_db, "df", df) # 此时筛选语句正常生效 dbSendQuery(test_db, "SELECT * FROM df WHERE date_col = '2019-01-01'") %>% dbFetch()
方法3:使用参数化查询
让RSQLite自动处理类型转换,避免手动处理格式问题:
dbSendQuery(test_db, "SELECT * FROM df WHERE date_col = ?", params = list(ymd("2019-01-01"))) %>% dbFetch()
内容的提问来源于stack exchange,提问作者MLEN
相关产品推荐
相关产品推荐

