Значения даты и времени нарезаны в RSQLite в зависимости от нулевых значений

Я столкнулся со странным феноменом при извлечении данных из базы данных SQLite 3 с помощью пакета RSQLite 1.0.0. Все значения datetime, кроме года, усекаются!

См. Пример:

Следом я извлекаю столбец 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>

Я действительно понятия не имею, что происходит и как это решить. Буду очень благодарен за любые указатели.

Привет, Алекс


person Alexander Meyer    schedule 07.07.2016    source источник
comment
В отличие от других RDMS, в SQLite3 нет класса хранения datetime, но SQLite является может сохранять дату и время как значения TEXT, REAL или INTEGER. Так столбец имеет числовой или строковый тип?   -  person Parfait    schedule 08.07.2016
comment
Большое спасибо за ваш ответ. Тип данных находится во всех столбцах ТЕКСТ.   -  person Alexander Meyer    schedule 08.07.2016
comment
В чем проблема? Каков ваш желаемый результат? Разве последний запрос не сработает?   -  person Parfait    schedule 08.07.2016
comment
На самом деле желаемый результат будет «ГГ-мм-дд ЧЧ: мм: сс». Это тоже правильное поведение. Однако, если в таблице существуют значения NULL, кажется, что драйвер RSQLite отбрасывает все, кроме года. Я почти уверен, что это ошибка RSQLite. Я провел довольно много исследований, прежде чем задать здесь этот вопрос - я просто хотел убедиться, что не ошибаюсь. Или, может быть, кто-то еще делал это наблюдение раньше. Я отправлю это сейчас как проблему на GitHub. Большое спасибо за ваши усилия.   -  person Alexander Meyer    schedule 09.07.2016


Ответы (1)


Current RSQLite немного слабоват, когда дело доходит до определения типа данных. В отличие от большинства СУБД, 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 здесь должен работать лучше.

person krlmlr    schedule 09.07.2016
comment
Большое спасибо за ответ! Я могу воспроизвести ваш код. Пытался изменить родство типов. Это не работает. Проблема заключается в значении NULL. typeof (NULL) имеет значение NULL, и я не могу изменить сродство для значений NULL. Я буду работать с обходным решением strftime, пока проблема не будет решена. В любом случае, большое спасибо за ваши усилия и отличный пакет! - person Alexander Meyer; 12.07.2016