Acabo de encontrar un problema interesante con un procedimiento que estoy escribiendo en SQL.¿Por qué la comparación de una variable de fecha SQL a null se comporta de esta manera?
En mi proc tengo 2 fechas, que son parametros opcionales por defecto en NULL, quiero comprobar si estos parametros no son nulos y si no se ejecutan parte de mi proc, si son nulos entonces la parte adicional de la proc es ignorado
Hice una declaración bastante básica IF(@dateVariable <> NULL AND @DateVariable2 <> NULL)
, pero la instrucción if nunca funciona incluso si las variables no son nulas, supongo que SQL está luchando por comparar la fecha con un NULL, lo cual es extraño ya que datetime es anulable.
Para solucionar esto acabo de hacer IF(DateVariable IS NOT NULL)
que funciona correctamente. También probé IF(ISNULL(@DateVariable,'') <> '')
, que también funciona correctamente
Así que mi pregunta es ¿por qué la primera IF no funciona, pero la segunda y la tercera sí lo hacen ya que ambas deben en algún momento comparar el contenido de la variable a nulo?
Ejemplo:
----- ----- falla
DECLARE @Date DATETIME
SET @Date = CURRENT_TIMESTAMP
IF (@Date <> NULL)
BEGIN
print('a')
END
----- ----- Trabaja
DECLARE @Date DATETIME
SET @Date = CURRENT_TIMESTAMP
IF (ISNULL(@Date,'') <> '')
BEGIN
print('a')
END
DECLARE @Date DATETIME
SET @Date = CURRENT_TIMESTAMP
IF (@Date IS NOT NULL)
BEGIN
print('a')
END
[lógica trivalente] (http://www.simple-talk.com/sql/learn-sql-server/sql-and-the-snare-of-three-valued -logic /) –
Piensa en 'NULL' como' Unknown Yet Value'. ¿Qué debería '@Date = Unknown Yet Value' yield? '¿Verdad'? 'Falso'? O 'No lo sabemos'? –