sql date format




DATETIME에서 DATETIME2 로의 변환이 값을 변경하는 것처럼 보이는 이유는 무엇입니까? (3)

SQL Server 2016에서는 datetime과 datetime2의 변환 및 비교와 관련하여 중요한 변경 사항 이 도입되었습니다. 변경 사항은 이 기술 자료 에서 자세히 설명 합니다.

요약하면 SQL 2014 및 이전 버전에서는 변환 도중 값이 반올림되었지만 요즘에는 전체 정밀도가 고려됩니다. 이렇게하면 성능이 향상되지만 이와 다른 유형을 변환하고 비교할 때 문제가 발생합니다.

두 날짜를 비교하는 저장 프로 시저가 있습니다. 제 신청서의 논리에서, 나는 그들이 평등하다고 기대했습니다. 그러나 비교가 실패했습니다. 그 이유는 값 중 하나가 DATETIME 으로 저장되었고 다른 DATETIME2 와 비교되기 전에 DATETIME2CONVERT 되어야했기 때문입니다. 분명히, 이것은 그것의 가치를 변화 시켰습니다. 나는이 작은 시험을했다.

DECLARE @DateTime DATETIME='2018-01-18 16:12:25.113'
DECLARE @DateTime2 DATETIME2='2018-01-18 16:12:25.1130000'
SELECT @DateTime, @DateTime2, DATEDIFF(NANOSECOND, @DateTime, @DateTime2)

어느 것이 나에게 다음과 같은 결과를주었습니다 :

이 값 사이에 333333ns의 차이가있는 이유는 무엇입니까? 나는 DATETIME2 가 더 정확한 타입으로 정확하게 DATETIME 저장 될 수있는 모든 값을 나타낼 수 있어야한다고 생각 했는가? DATETIME2의 문서 에만 표시됩니다 :

변환이 datetime에서 이루어지면 날짜와 시간이 복사됩니다. 분수 정밀도는 7 자리로 확장됩니다.

값에 333333ns를 더하거나 뺀 변환에 대한 경고는 표시되지 않습니다! 그러면 왜 이런 일이 일어날까요?

SQL Server 2016을 사용하고 있습니다.

편집 : 이상하게도, 다른 서버에서 나는 제로 차이를 얻고있다. 둘 다 SQL Server 2016이지만 문제가있는 곳은 호환성 수준이 130으로 설정되어 있으며 120으로 설정되어 있지 않습니다. 그 사이를 전환하면이 동작이 변경됩니다.

edit2 : DavidG은 주석에서 DATETIME2 아닌 DATETIME2 로 표현할 수있는 값을 제안했습니다. 따라서 @DateTime2 할당 할 값이 유효한 DATETIME 값인지 확인하기 위해 테스트를 수정했습니다.

DECLARE @DateTime DATETIME='2018-01-18 16:12:25.113'
DECLARE @DateTime2 DATETIME2=CONVERT(DATETIME2, @DateTime)
SELECT @DateTime, @DateTime2, DATEDIFF(NANOSECOND, @DateTime, @DateTime2)

이 차이는 작지만 여전히 0이 아니기 때문에 약간 도움이됩니다.


나에게 비교를 수행 할 때 이러한 차이가 발생하지 않도록 정밀도가 높은 데이터를 낮은 정밀도로 변환해야합니다.

DECLARE @DateTime DATETIME='2018-01-18 16:12:25.113'
DECLARE @DateTime2 DATETIME2='2018-01-18 16:12:25.1130000'
SELECT @DateTime, cast(@DateTime2 as datetime), DATEDIFF(NANOSECOND, @DateTime, cast(@DateTime2 as datetime))

결과는 다음과 같습니다.


datetime2datetime2(7) 약자로 분수 초 (최대)에 7 자리를 표시합니다. datetime2(3) 좀 더 가깝게하려면 datetime2(3) 시도하십시오.

또한 datetime2(3)datetime 보다 정확하다는 사실을 기억하십시오. 후자는 0.000, 0.003 또는 0.007에 가깝게 설계되었습니다.





datetime