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

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

15 голосов
/ 26 сентября 2008

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

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

SELECT * FROM someTable WHERE thisDateTime IS NOT NULL

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

Ответы [ 3 ]

16 голосов
/ 26 сентября 2008

эм это работает? Я только что проверил это?

/****** 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 голосов
/ 26 сентября 2008

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

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

1 голос
/ 04 июля 2012

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

select 1 where getdate()<>null

мы ожидаем, что он покажет 1, потому что getdate () не возвращает ноль. Я предполагаю, что это как-то связано с тем, что 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...