Używanie klauzuli WHERE z parametrami BETWEEN i daty null


Jedna z moich klauzul
WHERE
jest taka:
AND (DateCreated BETWEEN @DateFrom and @DateTo OR (@DateFrom IS NULL OR @DateTo IS NULL))

@DateFrom
i
@DateTo
są parametrami wejściowymi i mogą mieć wartość
NULL
.
Jeśli oba mają wartość null, to po prostu muszę zignorować
BETWEEN
i zwrócić wszystkie rekordy.
Jeśli
@DateFrom
ma wartość
NULL
, a
@DateTo
ma wartość
NOT NULL
, to muszę zwrócić wszystkie rekordy z wartością DateCreated nie przekroczenie
@DateTo
(włącznie).
Jeśli
@DateFrom
ma wartość
NOT NULL
, a
@DateTo
ma wartość
NULL
, to muszę zwrócić wszystkie rekordy z DateCreated nie wcześniej niż
@DateFrom
(włącznie) przed dzisiejszą datą.
DateCreated nie jest polem zerowym lub przez pewien czas to pole jest puste.
Jak dotąd moja klauzula
WHERE
nie działa tak, jak tego chcę.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Potrzebuje tylko dodatkowych kryteriów do obsłużenia, gdy jedno lub drugie ma wartość
NULL
:
AND ( (DateCreated >= @DateFrom and DateCreated < DATEADD(day,1,@DateTo)) 
OR (@DateFrom IS NULL AND @DateTo IS NULL)
OR (@DateFrom IS NULL AND DateCreated < DATEADD(day,1,@DateTo))
OR (@DateTo IS NULL AND DateCreated >= @DateFrom)
)

Edycja: podejście George'a było prostsze, tutaj jest dostosowane do użycia z
DATETIME
:
AND ( (DateCreated >= @DateFrom OR @DateFrom IS NULL) 
AND (DateCreated < DATEADD(day,1,@DateTo) OR @DateTo IS NULL)
)

Problem z
BETWEEN
lub
& < =
podczas używania zmiennej
DATE
w stosunku do pola
DATETIME
polega na tym, że zawsze po północy ostatniego dnia zostaną wykluczone.
'2015-02-11 13: 07: 56.017' więcej niż 2015-02-11 ' Zamiast korzystać z pola jako
Data <!-- ​​Code --> Dla porównania lepiej jest dodać dzień do zmiennej, aby zwiększyć wydajność i zmienić ją za pomocą[code]& LT; =
na
& LT;
. [/code]
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Spróbuj tego:
WHERE ((DateCreated >= @DateFrom OR @DateFrom IS NULL) AND (DateCreated =< @DateTo OR @DateTo IS NULL))
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Co powiesz na:
DateCreated BETWEEN COALESCE(@DateFrom, DateCreated) AND COALESCE(@DateTo, DateCreated)
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Użyj IT
Gdzie klauzula
WHERE ( DateCreated BETWEEN @DateFrom AND @DateTo )
OR ( @DateFrom IS NULL
AND @DateTo IS NULL )
OR ( @DateFrom IS NULL
AND DateCreated <= @DateTo )
OR ( @DateTo IS NULL
AND DateCreated >= @DateFrom )
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Można to zrobić po prostu za pomocą funkcji ISNULL.
DateCreated BETWEEN ISNULL(@DateFrom,DateCreated) AND ISNULL(@DateTo,DateCreated)
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

AND (DateCreated BETWEEN @DateFrom and @DateTo OR (ISNULL(@DateFrom, '')='' OR ISNULL(@DateTo, '')=''))

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się