日時フィールドを使用して SQL Server テーブルを更新する作業を行っているとき、次のような観察結果がありました。
> options(digits.secs = 3)
> z <- strptime("20/2/06 11:16:16.68", "%d/%m/%y %H:%M:%OS")
> z
[1] "2006-02-20 11:16:16.67"
> z <- strptime("20/2/06 11:16:16.683", "%d/%m/%y %H:%M:%OS")
> z
[1] "2006-02-20 11:16:16.682"
POSIXct 側で精度が失われていることがわかります。
似たような経験をした人はいますか?確認できればバグだと思います…ありがとうございます!
編集
以前にも同様の問題があったことを多くの人が指摘してくれたことに感謝します。それは実際にはRODBCの問題から生じました...解決策を見つけてよかったです。
require(RODBC)
ch <- odbcConnect('mydb')
/* mybus (Dt datetime, value float) */
sqlstmt <- 'select * from mybus;'
mybus <- sqlQuery(ch, sqlstmt)
mybus$value <- mybus$value + 1
sqlUpdate(ch, mybus, index='Dt', verbose=T)
close(ch)
**[RODBC] Failed exec in Update**
私の掘り下げは、エラーがSQLサーバーから読み取られたmybus $ Dt(R処理後)が原因であることを示しています。これは、SQLサーバーに保存されている元のものとはわずかに異なります。したがって、一致するものが見つからないため、sqlUpdate 操作は失敗しました。私もdatetime2を試しましたが、役に立ちませんでした。
私の現在の回避策は、SQLサーバー側でdatetimeを文字に変換することです:
sqlstmt <- 'select convert(nvarchar(24), Dt, 21) as Dt, value from mybus;'
R POSIXct 変換をバイパスします。