2016-08-10 229 views
0

我有一個包含多個日期和主日期(dm)的表格。我必須找出MS SQL腳本中主日期的最近日期。在下表中,d1最接近dm。在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

您只需要日期或信息。另外,如果它是d1還是d4? – Whencesoever

+0

你想要什麼輸出?這些真的存儲在同一行嗎? –

+0

2015.05.06在上述情況下 – bill

回答

1

在SQL Server中,apply可能是更容易的方法:

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

什麼是d。*和t.d?我有d語法錯誤。 – bill

1

試試這個

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 

結果

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