Как сделать SQL NOT NULL с DateTime?

Это может быть просто, но я не могу понять, как сделать простой DateTime с NOT NULL?

Я хочу сделать что-то вроде этого:

SELECT * FROM someTable WHERE thisDateTime IS NOT NULL

Но это явно не работает. Я использую MS SQL 2005, если это имеет значение. Спасибо.

Ответы

Ответ 1

Он работает? Я только что протестировал его?

/****** 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

Ответ 2

Просто, чтобы исключить возможность - она, похоже, не имеет ничего общего с опцией ANSI_NULLS, поскольку она контролирует сравнение с NULL с операторами = и <>. IS [NOT] NULL работает ли ANSI_NULLS ON или OFF.

Я также пробовал это против SQL Server 2005 с isql, потому что ANSI_NULLS по умолчанию используется OFF при использовании DB-Library.

Ответ 3

Я столкнулся с этой проблемой, когда следующий запрос не работает должным образом:

select 1 where getdate()<>null

мы ожидаем, что он покажет 1, потому что getdate() не возвращает null. Я предполагаю, что это имеет какое-то отношение к тому, что SQL не может отличить null как datetime и пропустить строку! конечно, мы знаем, что мы должны использовать ключевые слова IS или IS NOT для сравнения переменной с нулем, но при сравнении двух параметров трудно справиться с нулевой ситуацией. в качестве решения вы можете создать свою собственную функцию сравнения, например:

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

и запишите запрос следующим образом:

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