Pregunta

Según MSDN el rango para el tipo de datos de fecha es el 1 de enero de 1753 hasta el 31 de diciembre de 9999

En SQL2005 lo siguiente es interesante:

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'

cambie la fecha a '1/1/1901 12:00:00 AM' y de repente no aparece (@ date, 0) es 0.

¿Qué me estoy perdiendo?

(Editar) intervalo de fechas fijo para sql2005, enlace a sql2005 BOL

¿Fue útil?

Solución

Prueba esto:

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

Otros consejos

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 () es una función de conversión. No es la comprobación si un valor es NULL .

Una fecha tiene una representación numérica. La representación numérica de '1/1/1901 12:00:00 AM' es 0 , en SQL Server.

No puede comparar el resultado de ISNULL (@ date, 0) con 0 sin perder la capacidad de distinguir entre una fecha que podría representarse como 0 y una fecha que es NULL .

La siguiente línea de código es engañosa:

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

Esta línea devuelve 0 si @date == 0, no cuando es nulo. La fecha que ha especificado se almacena como 0 en una fecha y hora.

SELECT convert(datetime, 0)

para ver lo que quiero decir!

Intenté esto:

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'

No hay nada mal con ISNULL ni con COALESCE. El problema es que estás comparando con cero, y te engañas a ti mismo pensando que el ISNULL entró en acción. Pruebe mi código y vea que ISNULL devuelve el valor correcto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top