2012-04-12 4 views
8

나는이 소스에서 날짜 속성을 얻는 방법 (중 하나 DataRow 또는 SqlDataReader) :는 부정확

protected SqlDateTime GetSqlDateTimePropertyValue(string propertyName, object source) 
{ 
    var objValue = GetPropertyValue(propertyName, source); 
    var value = objValue == DBNull.Value ? null : (DateTime?)objValue; 
    var sqlValue = new SqlDateTime(); 
    if (value.HasValue) sqlValue = value.Value; 
    return sqlValue; 
} 

하지만 전환 수 있도록 약간의 날짜를 변경하는 것으로 나타납니다 내 검사는 항상 실패합니다.

누구나이 방법이 잘못 변환되는 이유를 알고 있습니까? SQL 서버 DATETIME는 3.33ms의 정확도를 가지고 - -의 .NET 데이터 형식 그러나 단일 나타낼 수

value.Value.Ticks:  634698391707468296 
sqlValue.Value.Ticks:  634698391707470000 
+0

참조 : http://stackoverflow.com/questions/7824766/how-does-sqldatetime-do-its-precision-reduction –

답변

9

예 : SqlDateTime로의 전환이 일부 반올림을하는 것처럼 방법의 끝에서

, 그것은 보인다 밀리 초.

따라서 때때로 반올림 문제가 발생합니다.

여기 DATETIME 데이터 유형과 그 특성과 단점에 대해 더 많은 읽기 : 또한, SQL 서버 2008은 새로운 날짜 관련 데이터 유형의 슬루 도입

Demystifying the SQL Server DATETIME datatype

- 여기에 대한 자세한 내용을 :

SQL Server 2008 New DATETIME datatypes

이 유형은 100ns의 정확 인 DATETIME2 데이터 유형을 포함 할.

+1

와우, 빠르고 우수한 응답! 감사합니다. –

3

이 내용은 TSQL 날짜 - 시간의 문서화 된 정확도입니다. "날짜/시간 소수 초 정밀도 반올림"절의 내용은 this link from MSDN입니다. 섹션에서 인용 다음 표에 나타낸 바와 같이

시간 값은 0.000, 0.003, 0.007 또는 초 단위로 반올림된다.

.NET 날짜 시간이 더 정확합니다.

또한 MS는 날짜 - 시간 대신 최신 데이터 형식 (예 : datetime2, 날짜, 시간 등)을 사용할 것을 권장합니다. Sql Server 2008에 도입 된 datetime2 데이터 형식은 .NET 날짜/시간 구조와 비슷한 정밀도 (100ns)가 비슷하며 .NET 날짜/시간에서 SQL 날짜/시간으로의 변환을 더 간단하게 만드는 ISO 8601 문자열 형식을 지원합니다 당신은 무료로 대신 매개 변수화 쿼리의 리터럴)과 손실을 사용하도록 강요하는 경우. 그것은 약간의 정밀도를 잃게됩니다 SQL로 변환 할 때 ((예

+0

감사합니다 vinayc! 나는 marc_s가 게시물에서 당신을 찔렀다 고 생각합니다. +1에 대한 훌륭한 대답과 감사합니다. –

0

SqlDateTime 개체는 .NET DateTime 개체 미만의 정밀도를 가지고 있으며, 그래서.