Заявление о случае, сравнивающее несколько дат

Я прочитал больше этих вопросов, чем хочу признать в отношении этого вопроса, однако все, что я пробовал из ответов, найденных здесь, по-прежнему терпит неудачу. Итак, поехали...

Я пытаюсь сравнить несколько дат из нескольких таблиц, чтобы найти самую последнюю дату. Соединения в запросе работают нормально, так как я делаю другие сравнения, и они работают нормально. Однако всякий раз, когда я пытаюсь запустить этот случай, я не получаю синтаксических ошибок или чего-то еще, что просто не выполняется в ELSE, даже если условия были выполнены. Это на SQL Server 2008R2.

Код:

SELECT
[OTHER COLUMNS],
'MOST_RECENT_DATE' = Case
    WHEN A.Date > B.Date AND A.Date > C.Date AND A.Date > D.Date THEN convert(varchar, A.Date,30)
    WHEN B.Date > A.Date AND B.Date > C.Date AND B.Date > D.Date THEN convert(varchar, B.Date,30)
    WHEN C.Date > A.Date AND C.Date > B.Date AND C.Date > D.Date THEN convert(varchar, C.Date,30)
    WHEN D.Date > A.Date AND D.Date > B.Date AND D.Date > C.Date THEN convert(varchar, D.Date,30)
    ELSE 'ATTENTION'
END
FROM TABLE E
LEFT JOIN TABLE A ON E.other = A.other
LEFT JOIN TABLE B ON E.other = B.other
LEFT JOIN TABLE C ON E.other = C.other
LEFT JOIN TABLE D ON E.other = D.other

Когда я ввожу одно сравнение, оно работает и возвращает мне дату, т.е.

CASE
    WHEN A.Date > B.Date THEN CONVERT(varchar,A.Date,30)
    ELSE 'WHATEVER'
END

Таким образом, проблема должна заключаться в множественных сравнениях, возможно, я просто слишком долго смотрел на это, и мне нужно уйти, но я не могу понять, почему это проваливается к другому, когда я знаю условие выполнено.

Мысли и соображения высоко ценятся в продвинутых. Если кому-то нужна дополнительная информация или мне нужно внести ясность, пожалуйста, дайте мне знать.


person bpw    schedule 10.09.2015    source источник
comment
извините, я должен отметить, что конверты на самом деле 105 стилей. Я пропустил ввод и скопировал и вставил.   -  person bpw    schedule 11.09.2015
comment
Ты можешь это сделать - SELECT [OTHER COLUMNS], A.Date, B.Date, C.Date, D.Date, 'MOST_RECENT_DATE' = ...? Таким образом, вы можете увидеть, есть ли проблема со сравнением нулевых дат.   -  person zedfoxus    schedule 11.09.2015
comment
Блестящий. Я знал, что слишком долго смотрел на него. Я забыл, что SQL будет вставлять 1900-01-01 как нулевое значение при отображении. Поэтому, когда я увидел, что возвращаемые значения имеют значение даты вместо нулевого крика, мне это не пришло в голову.   -  person bpw    schedule 11.09.2015


Ответы (1)


Рассмотрим следующий дизайн таблицы:

create table test1 (id int, date1 date);
insert into test1 values (1, '2015-04-04'), (2, '2015-04-04');

create table test2 (id int, date2 date);
insert into test2 values (1, '2015-04-05'), (2, NULL);

Этот запрос выдаст ожидаемые результаты для идентификатора 1, но неожиданные результаты для идентификатора 2.

select *, 

case 
when test1.date1 < test2.date2 then 'test1 is smaller' 
else 'test1 is not smaller' 
end as comment

from test1
inner join test2 on test1.id = test2.id;

-- Result
id  date1       id  date2      comment
1   2015-04-04  1   2015-04-05 test1 is smaller
2   2015-04-04  2   null       test1 is not smaller

Обратите внимание, что при оценке оператора CASE для идентификатора 2 управление перешло к части THEN оператора CASE.

Вы можете переписать свой оператор CASE разными способами, чтобы учесть значения NULL. Одним из таких способов является сравнение по умолчанию с каким-то днем ​​в далеком прошлом, например так:

CASE
WHEN A.Date > COALESCE(B.Date, '1900-01-01) 
     AND A.Date > COALESCE(C.Date, '1900-01-01') 
     AND A.Date > COALESCE(D.Date, '1900-01-01') 
     THEN convert(varchar, A.Date,30)
WHEN ....
ELSE 'ATTENTION'
person zedfoxus    schedule 10.09.2015
comment
Большое спасибо за быстрый ответ. Я переписал, используя объединение, и все работает, как и ожидалось. - person bpw; 11.09.2015
comment
Превосходно. Вы должны дождаться новых ответов, а затем отметить один из ответов как принятый, чтобы закрыть свой вопрос. - person zedfoxus; 11.09.2015