Вероятно, в этом выражении:
ISNULL(@day, CURRENT_TIMESTAMP) = CURRENT_TIMESTAMP
вы ожидаете, что CURRENT_TIMESTAMP
возвращает одинаковое значение в обе стороны, но это не то, что происходит. Значение, возвращаемое стороной вправо равенства, оценивается один раз для всего оператора, тогда как значение, возвращаемое стороной left , оценивается для каждой строки таблицы, поскольку она содержит переменную который может (или нет) изменился. Таким образом, временные метки отличаются, как вы можете видеть, если вы выполните это:
declare @day date = null;
select 1
where isnull(@day, current_timestamp) = current_timestamp
, который ничего не возвращает. Но если вместо переменной вы используете null
:
select 1
where isnull(null, current_timestamp) = current_timestamp
, то обе стороны оцениваются один раз и для всего оператора, и результат равен true
, так что вы получите результаты.
Но если вы сохраните возвращаемое значение current_timestamp
в переменной, например:
declare @currentday date = current_timestamp;
declare @day date = null;
select 1
where isnull(@day, @currentday) = @currentday
, то вы можете быть уверены, что сравниваете ту же метку времени, и вы получите результаты , См. демо .