选择具有给定条件的最大日期

时间:2018-04-17 05:35:49

标签: sql sql-server

我正在使用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

预期输出结果:

enter image description here

编辑 - 我需要第二个最短日期,此处添加了更多案例。

enter image description here

4 个答案:

答案 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)

您可以将subqueryvalues 构造函数一起使用

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]