Pergunta

De acordo com a MSDN o intervalo para data tipo de dados é 01 de janeiro de 1753, até 31 de dezembro de 9999

Em SQL2005 o seguinte é interessante:

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'

alterar a data para '1/1/1901 12:00:00 AM' e de repente isnull(@date,0) é 0.

O que eu estou ausente?

(Edit) daterange fixo para sql2005, link para sql2005 BOL

Foi útil?

Solução

Tente isto:

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

Outras dicas

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() é uma função de conversão. Não é a verificação se um valor é NULL.

A data tem uma representação numérica. A representação numérica do '1/1/1901 12:00:00 AM' passa a ser 0, no SQL Server.

Você não pode comparar o resultado de ISNULL(@date,0) para 0 sem perder a capacidade de distinguir entre uma data que poderia ser representado como 0 e uma data que é NULL.

A linha de código a seguir é enganosa:

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

Esta linha retorna 0 se @date == 0, não quando é nulo. A data que você especificou é armazenado como 0 em uma data e hora.

SELECT convert(datetime, 0)

para ver o que quero dizer!

Eu tentei isso:

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'

Existe nada errado com ISNULL nem com COALESCE. O problema é que você está comparando com zero, e você se engane em pensar que o ISNULL chutou. Tente meu código, e ver que IsNull retorna o valor correto.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top