SQL data gama tipo não de acordo com a especificação?
-
06-07-2019 - |
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
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.