2008-09-26 30 views
14

Esto podría ser simple, pero no puedo descifrar cómo hacer un DateTime simple con un NOT NULL?¿Cómo hacer un SQL NO NULO con un DateTime?

quiero hacer algo como esto:

SELECT * FROM someTable WHERE thisDateTime IS NOT NULL 

Pero eso, obviamente, no funciona. Estoy usando MS SQL 2005 si eso importa. Gracias.

+0

por qué no funciona? es la columna configurada para aceptar valores nulos? – Laurent

+0

¿puede darnos su esquema actual para la tabla en cuestión y la consulta exacta que está utilizando (si simplificó la consulta para los fines de la pregunta)? ¡Lo que estás haciendo debería funcionar bien! – robsoft

+1

"obviamente no funciona" ¿Por qué dices eso? Me funcionó la última vez que lo intenté. – Anthony

Respuesta

16

erm funciona? Acabo de probarlo?

/****** Object: Table [dbo].[DateTest] Script Date: 09/26/2008 10:44:21 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TABLE [dbo].[DateTest](
    [Date1] [datetime] NULL, 
    [Date2] [datetime] NOT NULL 
) ON [PRIMARY] 

GO 
Insert into DateTest (Date1,Date2) VALUES (NULL,'1-Jan-2008') 
Insert into DateTest (Date1,Date2) VALUES ('1-Jan-2008','1-Jan-2008') 
Go 
SELECT * FROM DateTest WHERE Date1 is not NULL 
GO 
SELECT * FROM DateTest WHERE Date2 is not NULL 
+0

Estoy de acuerdo, lo probé también. – Abbas

2

Sólo para descartar una posibilidad - no parece tener nada que ver con la opción ANSI_NULLS, debido a que controla comparando a NULL con los = y <> operadores. IS [NOT] NULL funciona si ANSI_NULLS es ON o OFF.

También he intentado esto contra SQL Server 2005 con isql, porque ANSI_NULLS usa de manera predeterminada OFF al usar DB-Library.

1

que se enfrentaron a este problema en la siguiente consulta no funciona como se esperaba:

select 1 where getdate()<>null 

esperamos que se muestran 1 porque getdate() no devuelve nulo. ¡Supongo que tiene algo que ver con el hecho de que SQL no ha emitido nulo como fecha y omite la fila! , por supuesto, sabemos que debemos usar IS o IS NOT keywords para comparar una variable con null, pero cuando se comparan dos parámetros, es difícil manejar la situación nula. como una solución puede crear su propia función de comparación como la siguiente:

CREATE FUNCTION [dbo].[fnCompareDates] 
(
    @DateTime1 datetime, 
    @DateTime2 datetime 
) 
RETURNS bit 
AS 
BEGIN 
    if (@DateTime1 is null and @DateTime2 is null) return 1; 
    if (@DateTime1 = @DateTime2) return 1; 
    return 0 
END 

y volver a escribir la consulta como:

select 1 where dbo.fnCompareDates(getdate(),null)=0 
Cuestiones relacionadas