SQL Server가 비교 목적으로 DateTime으로 날짜를 자동으로 상향 조정하지 않는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1701311

문제

SQL Server 2008의 새로운 날짜 데이터 유형을 좋아하지만 날짜 필드를 링크 된 서버 (SQL 2005,이 경우)의 DateTime 필드와 비교하면 다음과 같습니다.

DECLARE @MyDate DATE
SET @MyDate = CONVERT(DATE, GETDATE())

SELECT *
  FROM MySQL2005LinkedServer.SomeDB.dbo.SomeTable
 WHERE SomeDatetimeField < @MyDate

이 오류가 발생합니다.

OLE DB provider "SQLNCLI10" returned message "Unspecified error".
OLE DB provider "SQLNCLI10" returned message "The scale is invalid.".

"스케일은 유효하지 않다"는 기본 클라이언트가 날짜 데이터 유형을 링크 된 서버로 다시 전달하기 때문에 분명히 SQL 2005이기 때문에 무엇을 해야하는지 모른다. 2008 서버에 대해 동일한 쿼리를 실행하는 것이 잘 작동합니다. SQL Server는 문제없이 날짜 및 DateTime 데이터 유형을 비교할 수 있습니다.

내 질문은 다음과 같습니다. 기본 클라이언트가 '2009-11-09'의 날짜 값을 '2009-11-09 00 : 00 : 00.000'의 Datetime으로 자동 변환하지 않는 이유가 있습니까? SQL Server가 질식하지 않습니까?

도움이 되었습니까?

해결책

DateTime (2005) 및 Date / Time / DateTime2 DateTimeOffset (2008)의 내부 구조는 서로 매우 다르며 다른 비교와 마찬가지로 비교할 때 데이터를 동일한 유형으로 배치해야합니다. 따라서 기본 클라이언트는 그러한 변환을 강요해야합니다.

기본 클라이언트는 관대 할 수 있고 당신을 위해 암시 적 전환을 할 수 있지만, 제품이 작동하는 경향이있는 '최소한의 놀라운 요소'는 SQL 2005에 유형을 던지는 것이 기본적으로 이해하지 못하는 것을 거부해야한다고 제안해야합니다. 확실히 그로부터 미끄러질 수있는 여러 가지 미묘한 오류가 있습니다.

SQL 2005에서 DateTime2 (7)를 던지는 것도 마찬가지입니다. 100NS 정확도를 3.33ms 또는 던지기 및 오류로 다시 반올림 할 것으로 예상합니까? 오류를 선호하고 명시 적 캐스트를 선호합니다.

다른 팁

나는 이것이 그 때문이라고 추측 할 수있다 2009-11-09 00:00:00.000 시간 구역 중립이 아니며 더 미묘한 버그의 원인이 될 것입니다. 내가 틀렸다면 제발 수정 해주세요.

Alter Session Set NLS_DATE_FORMAT = 'MM/DD/YYYY HH : MI : SS AM'을 사용하여이를 달성 할 수 있습니다. 이것은 Temproray 솔루션입니다. YU가 UNIX에서 작업하는 경우 이러한 설정은 .profile에서 영구적으로 수행 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top