r语言 - 在 RSQLite 中切碎的日期时间值,具体取决于空值



在使用 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列具有INTEGERREAL亲和力,这会诱使RSQLite相信第一个值是一个数字。更新列相关性,或将strftime解决方法与所需的格式一起使用。

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

相关内容

  • 没有找到相关文章

最新更新