sqlSave を使用して ms sql に保存すると、RODBC が数値列の精度を失うのはなぜですか?
数字
Rで、数値列を含む次のデータフレームを作成します。既に丸められているように見えるかもしれませんが、これは印刷上の問題であり、丸められていません。
>test <- data.frame(
id=c(1,2,3),
numbers=c(12345678.90,12345678.91,12345678.92)
)
> str(test)
'data.frame': 3 obs. of 2 variables:
$ id : num 1 2 3
$ numbers: num 12345679 12345679 12345679
> test$numbers==123456789
[1] FALSE FALSE FALSE
データベースに保存すると、一部の精度が失われていることが示されているようです。
> dbconn <- odbcDriverConnect("driver={SQL Server};server=HOSTNAME\\SQL2014;database=test_db;trusted_connection=true")
> sqlSave(dbconn, test, fast=F, verbose=T)
Query: CREATE TABLE "test" ("rownames" varchar(255), "id" float, "numbers" float)
Query: INSERT INTO "test" ( "rownames", "id", "numbers" ) VALUES ( '1', 1, 12345679 )
Query: INSERT INTO "test" ( "rownames", "id", "numbers" ) VALUES ( '2', 2, 12345679 )
Query: INSERT INTO "test" ( "rownames", "id", "numbers" ) VALUES ( '3', 3, 12345679 )
データベースからデータフレームを取得することで、精度が実際に失われていることを確認できます。
> test2<-sqlFetch(dbconn, "test")
> test2
id numbers
1 1 12345679
2 2 12345679
3 3 12345679
> test2$numbers==12345679
[1] TRUE TRUE TRUE
float は正しい列タイプのようですが、rodbc に文字変換の代わりに使用させる方法はありますか? デフォルトの as.character でも機能します。
> as.character(test$numbers)
[1] "12345678.9" "12345678.91" "12345678.92"
日付
Date クラスの列は float 型の ms sql 列になり、誤った値が格納されます。
> test <- data.frame(id=c(1,2,3),date=as.Date(c("2014-12-21","2014-12-22","2014-12-23")))
> sqlSave(dbconn, test, fast=F, verbose=T)
Query: CREATE TABLE "test" ("rownames" varchar(255), "id" float, "date" float)
Query: INSERT INTO "test" ( "rownames", "id", "date" ) VALUES ( '1', 1, 2014-12-21 )
Query: INSERT INTO "test" ( "rownames", "id", "date" ) VALUES ( '2', 2, 2014-12-22 )
Query: INSERT INTO "test" ( "rownames", "id", "date" ) VALUES ( '3', 3, 2014-12-23 )
> test2<-sqlFetch(dbconn, "test")
> test2
id date
1 1 1981
2 2 1980
3 3 1979
日付は式として解釈されるため、次のようになります。
> 2014-12-21
[1] 1981
> packageVersion("RODBC")
[1] ‘1.3.10’