比较多个日期的案例陈述
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'
我已经阅读了更多这些问题,然后我愿意承认关于此事,但是,我从此处找到的答案中尝试的一切仍然失败。那么我们开始吧...
我正在尝试比较多个表中的多个日期以查找最近的日期。查询中的连接工作正常,因为我正在进行其他比较并且它们工作正常。但是,每当我尝试 运行 这种情况时,即使满足条件,我也没有语法错误或任何它只是落入 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'