¿El rango de tipo de fecha SQL no está de acuerdo con las especificaciones?
-
06-07-2019 - |
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
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 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.