日期时间值在RSQLite中切断,具体取决于空值

时间:2016-07-07 23:23:05

标签: r sqlite datetime rsqlite r-dbi

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

查看示例:

我正在提取DATETIME列:

select yti.year, yti.techindex, avg(lcoe.lcoe)
from (select distinct year, techindex from lcoe) yti 
     lcoe
     on yti.year = lcoe.year and yti.techindex = lcoe.techindex
group by yti.year, yti.techindex;

这让我得到以下结果:

library(RSQLite)
src_path <- "../DataLocked/Study.db"
con <- dbConnect(SQLite(), src_path)
dbGetQuery(con, "SELECT Todesdatum FROM Kontraindikation LIMIT 10")

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

        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")

现在我尝试在DATETIME字段上执行字符串格式:

            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
...

有效:

dbGetQuery(con, "SELECT strftime('%Y-%m-%d',Todesdatum) as fixed_Todesdatum FROM Kontraindikation 10")

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

问候, 亚历

1 个答案:

答案 0 :(得分:0)

当涉及到数据类型的检测时,当前RSQLite有点弱。与大多数DBMS不同,SQLite可以存储arbitrary data types in each entry of a 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应该在这里做得更好。