首页 > 解决方案 > 如何在 SQL Server 中获取最接近记录日期的日期?

问题描述

我有以下数据结构:

表 A

ID  |  RequestNumber  |  Date
----+-----------------+-----------
 1  |      1          | 2017/09/27
 2  |      1          | 2018/06/02

表 B

RequestNumber  |  Serial  |  Date
---------------+----------+-----------
     1         |    1     | 2017/09/27
     1         |    2     | 2017/09/27
     1         |    6     | 2018/06/03
     1         |    7     | 2018/06/03
     1         |    8     | 2018/06/03

正如我们所见,最接近第一行的日期Table A是 2017/09/27,Table B最接近第二行的日期是 2018/06/03Table B

所以...

我需要一个查询来让每一行从最接近记录的Table A所有行开始(这意味着第一个记录应该返回 2 条记录,第二条记录应该返回 3 条记录)Table BTable A

预期的结果是:

ID  |  RequestNumber  |  Serial  |  Date
----+-----------------+----------+------------
 1  |      1          |    1     | 2017/09/27
 1  |      1          |    2     | 2017/09/27
 2  |      1          |    6     | 2018/06/03
 2  |      1          |    7     | 2018/06/03
 2  |      1          |    8     | 2018/06/03

提前致谢

标签: sqlsql-server

解决方案


此查询将执行您想要的操作。它连接TableATableBon RequestNumber,然后连接到 和 之间的最小值表,DATEDIFF确保我们只获得结果中最接近的日期:TableBTableA

SELECT a.ID, a.RequestNumber, b.Serial, b.Date 
FROM TableA a
JOIN TableB b ON b.RequestNumber = a.RequestNumber
JOIN (SELECT a.ID AS ID, MIN(ABS(DATEDIFF(day, b.Date, a.Date))) AS days
      FROM TableA a
      JOIN TableB b ON b.RequestNumber = a.RequestNumber
      GROUP BY a.ID) c  ON c.ID = a.ID AND c.days = ABS(DATEDIFF(day, b.Date, a.Date))

输出:

ID  RequestNumber   Serial  Date
1   1               1       27/09/2017 09:30:00
1   1               2       27/09/2017 09:30:00
2   1               6       03/06/2018 09:30:00
2   1               7       03/06/2018 09:30:00
2   1               8       03/06/2018 09:30:00

dbfiddle 上的演示


推荐阅读