在使用 RSQLite 3 包从 SQLite 3 数据库中提取数据时,我遇到了一个奇怪的现象。除日期时间值的年份外,所有值都将被截断!
请参阅示例:
下面我提取了一个日期时间列:
library(RSQLite)
src_path <- "../DataLocked/Study.db"
con <- dbConnect(SQLite(), src_path)
dbGetQuery(con, "SELECT Todesdatum FROM Kontraindikation LIMIT 10")
这让我得到以下结果:
Todesdatum
1 NA
2 NA
3 2004
4 NA
5 2006
6 NA
7 NA
8 NA
9 NA
10 NA
现在从同一个表中,我省略了非空值:
dbGetQuery(con, "SELECT Todesdatum FROM Kontraindikation WHERE Todesdatum NOTNULL")
这让我得到以下结果:
Todesdatum
1 2004-09-16 00:00:00
2 2006-04-20 00:00:00
3 2006-06-02 00:00:00
4 2007-09-15 00:00:00
5 2008-06-12 00:00:00
6 2005-10-04 00:00:00
7 2008-11-22 00:00:00
8 2005-12-22 00:00:00
9 2006-11-05 00:00:00
10 2006-02-08 00:00:00
...
现在我尝试在 DATETIME 字段上做一个字符串格式:
dbGetQuery(con, "SELECT strftime('%Y-%m-%d',Todesdatum) as fixed_Todesdatum FROM Kontraindikation 10")
那行得通:
fixed_Todesdatum
1 <NA>
2 <NA>
3 2004-09-16
4 <NA>
5 2006-04-20
6 <NA>
7 <NA>
8 <NA>
9 <NA>
10 <NA>
我真的不知道发生了什么以及如何解决这个问题。我将非常感谢任何指示。
问候亚历克斯
当前RSQLite
在检测数据类型方面有点弱。与大多数DBMS不同,SQLite可以在列的每个条目中存储任意数据类型。
您没有提交可重现的示例,但我能够复制该问题:
library(tibble)
library(DBI)
a <- tibble(a = c(NA_integer_), b = 1)
b <- tibble(a = c("2014-06-04 00:00:00"), b = 2)
con <- dbConnect(RSQLite::SQLite(), ":memory:")
dbWriteTable(con, "test", a)
dbWriteTable(con, "test", b, append = TRUE)
dbReadTable(con, "test")
对于a
列,这两个数据框具有不同的数据类型,首先通过写入a
此列创建为INTEGER
。如果我将NA_integer_
更改为NA_character
,问题就会消失。你能复制这个吗?
可能是您的Todesdatum
列具有INTEGER
或REAL
亲和力,这会诱使RSQLite
相信第一个值是一个数字。更新列相关性,或将strftime
解决方法与所需的格式一起使用。
无论如何,我同意RSQLite应该在这里做得更好。