2016-07-07 4 views
3

RSQLite 1.0.0パッケージを使用してSQLite 3データベースからデータを抽出するときに奇妙な現象が発生します。 datetime値の年を除くすべてが切り捨てられます!null値に応じてRSQLiteで日時値がチョップされる

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

これは私に次のような結果を取得::私はNONを省略しています同じテーブルから今

 Todesdatum 
    1   NA 
    2   NA 
    3  2004 
    4   NA 
    5  2006 
    6   NA 
    7   NA 
    8   NA 
    9   NA 
    10   NA 

を私はDATETIME列を抽出しています続き

例を参照してください。 NULL値:

dbGetQuery(con, "SELECT Todesdatum FROM Kontraindikation WHERE Todesdatum NOTNULL") 

これは私に次のような結果を取得:いいえ、私は本当に持っている

 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> 

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

作品何が起きているのか、これをどのように解決するのかというアイデア。 私はどのポインタについても非常に感謝しています。それは、データ型の検出に来るとき

挨拶、 アレックス

+0

他のRDMSと異なり、SQLite3 *には[datetime](http://www.tutorialspoint.com/sqlite/sqlite_data_types.htm)ストレージクラスはありませんが、SQLiteはTEXT、REAL、またはINTEGERとして日付と時刻を格納できます値*。列は数値型か文字列型ですか? – Parfait

+0

お返事ありがとうございました。データ型はすべての列TEXTにあります。 –

+0

問題は何ですか?あなたの望む結果は何ですか?最後のクエリは機能しませんか? – Parfait

答えて

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

2つのデータフレームがa列の異なるデータ型を持って、この列が作成された最初のaを書き込むことによって、 INTEGERとします。 NA_integer_NA_characterに変更すると、問題は解決しません。これを複製できますか?

それはあなたのTodesdatum列が第1の値が数値であることを信じるようにINTEGERまたはREAL親和性、トリックRSQLiteを持っている可能性があります。列の親和性を更新するか、またはstrftime回避策を使用して目的の書式を設定してください。

とにかく、私はここでRSQLiteがより良い仕事をすることに同意します。

+0

ありがとうございました!私はあなたのコードを複製することができます。私はタイプの親和性を変えようとしました。それは動作しません。問題はNULL値です。 typeof(NULL)がNULLで、NULL値のアフィニティを変更できません。私は問題が解決するまで、strftimeの回避策で作業します。とにかく、あなたの努力と素晴らしいパッケージに感謝します! –

関連する問題