3

在使用 RSQLite 1.0.0 包从 SQLite 3 数据库中提取数据时,我遇到了一个奇怪的现象。除日期时间值的年份之外的所有内容都会被截断!

看一个例子:

在我提取 DATETIME 列之后:

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

现在从同一张表中,我省略了 NON NULL 值:

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>

我真的不知道发生了什么以及如何解决这个问题。我会非常感谢任何指示。

问候,亚历克斯

4

1 回答 1

0

在检测数据类型时,电流RSQLite有点弱。与大多数 DBMS 不同,SQLite 可以在 column 的每个条目中存储任意数据类型

您没有提交可重现的示例,但我能够重现该问题:

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列具有INTEGERREAL亲和性,这会欺骗您RSQLite相信第一个值是数字。更新列关联,或使用strftime您想要的格式的解决方法。

无论如何,我同意 RSQLite 应该在这里做得更好。

于 2016-07-09T13:13:59.203 回答