2013-08-21 2 views
0

는 날짜 필드에 SQL Server 테이블을 업데이트하는 작업을 할 때, 나는 다음과 같은 관찰했다하십시오R : 정밀도의 손실 날짜와 바인딩 POSIXct (SQL 서버)

> 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 서버에 저장된 원래의 것과 약간 상이한 $ DT는 (R 처리 후) SQL 서버로부터 판독 mybus에 기인 것을 나타낸다 따라서 일치 항목을 찾을 수 없기 때문에 sqlUpdate 작업이 실패했습니다. 나 또한 datetime2 시도했지만 쓸모가 없습니다.

나의 현재 해결 방법은 SQL 서버 측에서 문자로 날짜를 변환하는 것입니다 :

sqlstmt  <- 'select convert(nvarchar(24), Dt, 21) as Dt, value from mybus;' 

는 R POSIXct 변환을 우회 할 수 있습니다.

+0

이것은 알려진 부동 소수점 정밀도 문제입니다. 또한'z'는'POSIXct'가 아니라'POSIXlt' 객체입니다. 'POSIXct'로 변환하면 아무런 문제가 없습니다. –

답변

1

사용중인 OS는 무엇입니까?

R> z <- strptime("20/2/06 11:16:16.683", "%d/%m/%y %H:%M:%OS") 
R> z 
[1] "2006-02-20 11:16:16.683" 
R> 

우분투를 사용하면 문제가 없습니다.

+0

Tanks! 나는 윈도우에 있지만 흠, 그것이 플랫폼 독립적이어야한다고 가정한다. –

관련 문제