我正在使用SQL server 2012
create table t(dt1 date,dt2 date,dt3 date,dt4 date)
insert into t values('1970-01-01','2008-10-10',NULL,NULL),(NULL,'2008-10-10','2017-10-12',NULL),('1970-01-01','2008-10-10',NULL,'2018-10-09')
我需要从这些列中获取最小日期,如果列值= '1970-01-01'
,那么我需要第二个最小日期。
以下是我尝试的结果不正确的结果。
select *,case when (dt1='1970-01-01' or dt2='1970-01-01' or dt3='1970-01-01' or dt4='1970-01-01' )and dt1<=dt2 then dt1 else dt2
end as DDt
from t
预期输出结果:
编辑 - 我需要第二个最短日期,此处添加了更多案例。
答案 0 :(得分:1)
使用outer apply
select *
from t
outer apply (select ddt = min(v)
from (values (dt1), (dt2), (dt3), (dt4)) q(v)
where v > '19700101'
) q
答案 1 :(得分:1)
以下查询适用于该方案: -
SELECT *, MinValue
FROM t
CROSS APPLY (SELECT MIN(d) MinValue FROM (VALUES (dt1), (dt2), (dt3),(dt4)) AS
a(d) WHERE d <> '01-01-1970') A
答案 2 :(得分:1)
您可以将subquery
与values
构造函数一起使用
select *, (select min(dates)
from (values (dt1), (dt2), (dt3), (dt4))a(dates)
where a.dates > '1970-01-01') as DDt
from t;
答案 3 :(得分:1)
试试这个解决方案:
SELECT * , (SELECT MIN(Dates) FROM (VALUES (dt1), (dt2), (dt3), (dt4)) AS Fields(Dates) WHERE Fields.Dates > '1970-01-01') AS DDT
FROM [dbo].[t]