如何比较两个表之间的日期字段,并从第二个表

时间:2017-05-08 17:28:58

标签: sql sql-server

我有两张桌子。表A和表B.它们都有日期字段。我需要比较这些字段并得到一个表C,表A和表B之间的日期越来越少或相等,考虑到表A是主要的。

  

背景信息:我在表A中列出了产品的到期时间,以及工作日的表B中。用户可以在确定时更新表B.   日期不应被视为“营业日”。然后删除   表B中的日期然后转到表A以更新所有产品   在该日期登记的过期并将其分配给   上一个工作日。所以在我的情况下,我正在创建表C,其中   包含表A的Id和工作日期小于或等于   提及日期。然后我将进行相应的更新。

IF OBJECT_ID('tempdb..#tmpA') IS NOT NULL DROP TABLE #tmpA
IF OBJECT_ID('tempdb..#tmpB') IS NOT NULL DROP TABLE #tmpB


CREATE TABLE #tmpA(Id INT IDENTITY(100,1),Fecha date)

INSERT INTO #tmpA(Fecha)
VALUES
('20170101'),('20171003'),('20170504'),('2017-09-01')

SELECT * FROM #tmpA

Id          Fecha
----------- ----------
100         2017-01-01
101         2017-10-03
102         2017-05-04
103         2017-09-01

CREATE TABLE #tmpB(Id INT IDENTITY(1,4),Fecha date)

INSERT INTO #tmpB(Fecha)
VALUES
('20170101'),('20171001'),('20170504')

SELECT * FROM #tmpB

Id          Fecha
----------- ----------
1           2017-01-01
5           2017-10-01
9           2017-05-04

我想得到这个结果(表A中的记录数相同):

Id          Fecha
----------- ----------
100         2017-01-01
101         2017-10-01 --> **this row is less than 2017-10-03**
102         2017-05-04
103         2017-05-04 --> **this row is less than 2017-09-01**

我尝试构建一些没有结果的查询,

IF OBJECT_ID('tempdb..#tmpC') IS NOT NULL DROP TABLE #tmpC
SELECT A.* INTO #tmpC FROM #tmpA A LEFT JOIN #tmpB B ON A.Fecha = B.Fecha WHERE  B.Fecha IS NULL

SELECT * FROM #tmpC 

SELECT *
FROM #tmpA A INNER JOIN 
(
    SELECT * 
    FROM #tmpC
    GROUP BY id, Fecha

) AS Q ON MAX(Q.Fecha) <= A.Fecha

更新:

注意。 Id列只是一个标识,但并不意味着它应该是相关的。重要的是日期。

此致

3 个答案:

答案 0 :(得分:1)

虽然我不确定这是否可以很好地扩展(如果你有超过10万行),这将带回你想要的结果。
理论上,以 可以扩展的方式执行此操作的正确方法是使用RANK()并将这两个表连接在一起的视图,尽管这是快捷方便。请尝试这个,如果符合您的要求,请告诉我 为了您的启发,我已将两个日期留在那里,以便您能够比较它们。

SELECT
    A.ID
    ,A.FECHA OLDDATE
    ,B.FECHA CORRECTDATE
FROM #TMPA A
LEFT OUTER JOIN #TMPB B ON 1=1
WHERE 1=1 
AND B.FECHA = (
    SELECT MAX(FECHA)
    FROM #TMPB
    WHERE FECHA <= A.FECHA)

答案 1 :(得分:0)

这是你想要的吗?

select a.id,
       (case when b.fecha < a.fecha then b.fecha else a.fecha end) as fecha
from #tmpA a left join
     #tmpB b
     on a.id = b.id;

答案 2 :(得分:0)

你可以通过联盟全部获得最低分数

select id, min(fecha) from (
   select * from #tmpA
     union all
   select * from #tmpB
  ) a
 group by a.id