2016-08-10 1 views
0

Ich habe eine Tabelle mit mehreren Daten und Hauptdatum (dm) .Ich muss herausfinden, das Datum in MS SQL-Skript.e.g. In der folgenden Tabelle ist d1 dm am nächsten.Finden Sie heraus, nächsten Datum zu einem bestimmten Datum in einer Reihe in Sql

d1   |d2  |dm  |d3  |d4  |d5 
2015.05.06 |2015.10.06|2015.05.05|2015.01.06|2015.06.06|2015.08.06 
+0

brauchen Sie nur Datum oder auch Informationen, wenn es war d1 oder d4? – Whencesoever

+0

Was ist die gewünschte Ausgabe? Sind diese wirklich in der gleichen Reihe gespeichert? –

+0

2015.05.06 in obigem Fall – bill

Antwort

1

In SQL Server ist apply wahrscheinlich die einfachere Methode:

select t.*, dd.d as closest_date, dd.dname as closest_date_column 
from t cross apply 
    (select top 1 v.* 
     from (values (d1, 'd1'), (d2, 'd2'), (d3, 'd3'), (d4, 'd4')) v(d, dname) 
     order by abs(datediff(day, v.d, t.dm)) 
    ) dd; 
+0

Was ist d. * Und t.d? Ich habe Syntaxfehler mit d. – bill

1

Versuchen Sie, diese

DECLARE @Tbl TABLE (d1 DATETIME, d2 DATETIME, d3 DATETIME, d4 DATETIME,d5 DATETIME, dm DATETIME) 

INSERT INTO @Tbl 
SELECT 
    '2015.05.06', 
    '2015.10.09', 
    '2015.01.06', 
    '2015.06.06', 
    '2015.08.06', 
    '2015.05.05' 


SELECT 
    *, 
    (SELECT TOP 1 A.d 
    FROM 
    (
     SELECT ABS(DATEDIFF(DAY, T.dm, T.d1)) a, T.d1 d union all 
     SELECT ABS(DATEDIFF(DAY, T.dm, T.d2)) a, T.d2 d union all 
     SELECT ABS(DATEDIFF(DAY, T.dm, T.d3)) a, T.d3 d union all 
     SELECT ABS(DATEDIFF(DAY, T.dm, T.d4)) a, T.d4 d union all 
     SELECT ABS(DATEDIFF(DAY, T.dm, T.d5)) a, T.d5 d 
    ) A ORDER BY A.a) ClosestDate 
FROM 
    @Tbl T 

Ergebnis

d1   d2   d3   d4   d5   dm   ClosestDate 
2015-05-06 2015-10-09 2015-01-06 2015-06-06 2015-08-06 2015-05-05 2015-05-06 
Verwandte Themen