比较多个日期的案例陈述

Case Statement comparing multiple dates

我已经阅读了更多这些问题,然后我愿意承认关于此事,但是,我从此处找到的答案中尝试的一切仍然失败。那么我们开始吧...

我正在尝试比较多个表中的多个日期以查找最近的日期。查询中的连接工作正常,因为我正在进行其他比较并且它们工作正常。但是,每当我尝试 运行 这种情况时,即使满足条件,我也没有语法错误或任何它只是落入 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

当我进行单次比较时,它起作用了,returns 日期是我。

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

所以问题必须出在多重比较上,我可能只是盯着这个看了很久,需要走开,但我终究无法弄清楚为什么这会落到否则当我知道满足条件时。

非常感谢先进的想法和注意事项。如果有人想了解更多信息,或者如果我需要让自己更清楚,请告诉我。

考虑以下 table 设计:

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);

此查询将为 ID 1 生成预期结果,但为 ID 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

请注意,在为 id 2 计算 CASE 语句时,控制跳转到 CASE 语句的 THEN 部分。

您可以通过多种方式重写 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'