Sql 如何比较两个表之间的日期字段并从第二个表中获取较小或相等的日期
我有两张桌子。表A和表B。它们都有日期字段。我需要比较这些字段,得到表a和表B之间日期小于或等于的表C,考虑到表a是主要的 上下文:我在表A中列出了产品的有效期,在表B中列出了工作日的有效期。用户可以在确定时更新表B 该日期不得视为工作日。然后删除 从表B中选择日期,然后转到表A以更新所有产品 在该日期注册的到期日,并将其分配给 前一个工作日。在我的例子中,我创建了表C 包含表A的Id和小于或等于 提到的日期。然后我将进行相应的更新 我希望得到与表A中记录数相同的结果: 我试图构建一些没有结果的查询Sql 如何比较两个表之间的日期字段并从第二个表中获取较小或相等的日期,sql,sql-server,Sql,Sql Server,我有两张桌子。表A和表B。它们都有日期字段。我需要比较这些字段,得到表a和表B之间日期小于或等于的表C,考虑到表a是主要的 上下文:我在表A中列出了产品的有效期,在表B中列出了工作日的有效期。用户可以在确定时更新表B 该日期不得视为工作日。然后删除 从表B中选择日期,然后转到表A以更新所有产品 在该日期注册的到期日,并将其分配给 前一个工作日。在我的例子中,我创建了表C 包含表A的Id和小于或等于 提到的日期。然后我将进行相应的更新 我希望得到与表A中记录数相同的结果: 我试图构建一些没有结果的
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列只是一个标识,但并不意味着它应该是相关的。重要的是日期
这是你想要的吗
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;
你可以通过联合得到最小值
select id, min(fecha) from (
select * from #tmpA
union all
select * from #tmpB
) a
group by a.id
虽然我不确定这是否能很好地扩展,如果您有超过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)
解释得很好。你能解释一下你刚才提供的更新吗?如果ID列不相关,您打算如何连接这些表?Hi@Eli,因为ID列只是一个标识,但并不意味着它应该相关。重要的是日期。我刚刚用不同的Id更新了我的问题。请检查我的问题。@JotaPardo是什么阻止了逻辑将表A中的每个值与表B中的每个值进行比较?您的表中似乎还有一些数据/列,您还没有将其放入问题中。@Eli,谢谢您的关注。事实上,附加字段与解决方案无关,但考虑到上下文,我将更新问题。基本上,上下文是我在表A中列出了产品的有效期,在表B中列出了工作日的有效期。当确定某个日期不被视为工作日时,用户可以更新表B。[继续…]嗨,Kandasamy,谢谢你的回答。然而,在我的例子中,如果我将“20170901”添加到表A中,我希望从表B中得到“20170504”,因为是小于“20170901”的结果。嗨,戈登·林诺夫,谢谢你的回答。然而,在我的例子中,例如,如果我将“20170901”添加到表A中,我希望从表B中得到结果“20170504”,因为我用1K行测试的结果小于“20170901”,并且我得到的行比表A的行多。然而,这是正确的!只需添加“DISTINCT”语句。为什么要使用“WHERE 1=1”?很高兴这样做有效,请记住标记为答案。对于其中的1=1;这是我的一个习惯,因为我经常出于测试目的注释where子句,以此类推,当您没有where 1=1时,您可能需要更多的编辑来启用第二个where子句,而不是第一个where子句。我在生产中会用到它,但在开发中通常会用到。请不要忘记在你的答案中添加DISTICT这个词。你需要distinct的唯一原因是如果你在表B中有重复项。你能检查一下那1k行,看看它们是否存在吗?根据您对表B的描述,那里不应该有任何重复项。
select id, min(fecha) from (
select * from #tmpA
union all
select * from #tmpB
) a
group by a.id
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)