문제

에 따르면 MSDN 날짜 데이터 유형의 범위는 1753 년 1 월 1 일, 9999 년 12 월 31 일입니다.

SQL2005에서 다음은 흥미 롭습니다.

declare @date as datetime
SET @date = '1/1/1901 12:00:00 AM'
SELECT @date

if (isnull(@date,0) = 0) SELECT 'date is null' ELSE SELECT 'date not null'

날짜를 변경하십시오 '1/1/1901 12:00:00 AM' 그리고 갑자기 isnull(@date,0) 0입니다.

내가 무엇을 놓치고 있습니까?

(편집) SQL2005의 고정 Dateange, SQL2005 BOL 링크

도움이 되었습니까?

해결책

이 시도:

declare @date as datetime
SET @date = '1/1/1901 12:00:00 AM'

SELECT @date, CASE WHEN @date IS NULL THEN 'date is null' ELSE 'date not null' END

다른 팁

declare @date as datetime
SET @date = '1/1/1901 12:00:00 AM'
SELECT @date

if @date is null SELECT 'date is null' ELSE SELECT 'date not null'

ISNULL() 변환 기능입니다. 값이 있는지 확인하는 것은 아닙니다 NULL.

날짜에는 숫자 표현이 있습니다. 숫자 표현 '1/1/1901 12:00:00 AM' 발생합니다 0, SQL Server에서.

결과를 비교할 수 없습니다 ISNULL(@date,0) 에게 0 다음으로 표시 될 수있는 날짜를 구별하는 능력을 잃지 않고 0 그리고 날짜입니다 NULL.

아래 코드 라인은 오해의 소지가 있습니다.

if (isnull(@date,null) = 0) SELECT 'date is null' ELSE SELECT 'date not null'

이 줄은 0이됩니다 @date == 0, ~ 아니다 그것이 널 일 때. 지정된 날짜는 DateTime에서 0으로 저장됩니다.

SELECT convert(datetime, 0)

내가 의미하는 바를보기 위해!

나는 이것을 시도했다 :

declare @date as datetime
SET @date = '1/1/1901 12:00:00 AM'
SELECT @date, CONVERT(numeric(9,3), @date) as DateValue
if (isnull(@date,0) = 0) SELECT 'date is zero' ELSE SELECT 'date not equal to zero (THIS PRINTS)'
if (isnull(@date,0) = 365) SELECT 'date is 365 (THIS PRINTS)' ELSE SELECT 'date not equal to zero'
if (@date = 365) SELECT 'date is 365 (THIS PRINTS)' ELSE SELECT 'date not 365'

SET @date = '1/1/1900 12:00:00 AM'
SELECT @date, CONVERT(numeric(9,3), @date) as DateValue
if (isnull(@date,0) = 0) SELECT 'date is equal to Zero (THIS PRINTS)' ELSE SELECT 'date not null'
if (@date = 0) SELECT 'date is equal to Zero (THIS PRINTS)' ELSE SELECT 'date not null'

거기 있습니다 아무것도 아님 Isnull이나 Coalesce에 잘못. 문제는 당신이 Zero와 비교하고 있고, 당신은 isnull이 시작되었다고 생각하는 데 자신을 속이는 것입니다. 내 코드를 시도하고 Isnull이 올바른 값을 반환한다는 것을 알 수 있습니다.

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