MySQL中如何基于日期连接两张表?满足日期匹配或10天内条件
MySQL联表查询:匹配日期相等或相差10天内的记录
嘿,我来帮你搞定这个查询需求!首先咱们得明确,你提到的条件2和3其实是同一个逻辑——毕竟两个日期的相差天数是双向的,不管是actual_checkdate比expected_checkdate早10天,还是晚10天,本质都是两者的间隔在10天以内。所以我们可以把这两个条件合并简化,再加上条件1来写查询。
核心查询代码
先直接给你能用的SQL,然后再拆解说明:
SELECT t1.company_id, t1.expected_checkdate, t2.actual_checkdate FROM t1 INNER JOIN t2 ON t1.company_id = t2.company_id WHERE -- 条件1:实际检查日期和预期日期完全相等 t1.expected_checkdate = t2.actual_checkdate -- 条件2/3合并:两者相差不超过10天(包含10天) OR ABS(DATEDIFF(t1.expected_checkdate, t2.actual_checkdate)) <= 10;
关键部分解释
- 联表方式:用
INNER JOIN通过company_id关联两张表,这样只会返回两张表中都有对应company_id的记录。如果你需要保留t1中没有匹配t2的记录(哪怕actual_checkdate为NULL),可以换成LEFT JOIN,不过这种NULL的记录大概率不满足你的日期条件,所以INNER JOIN更合适。 - 日期比较逻辑:
DATEDIFF(a, b)会返回a减去b的天数(正数表示a比b晚,负数表示a比b早)。- 用
ABS()取绝对值后,就能统一判断两个日期的间隔是否在10天以内,不管谁在前谁在后。 - 条件1的相等其实已经包含在
ABS(DATEDIFF(...)) <= 10里(因为相差0天),但如果你想明确分开写也没问题,不会影响结果。
额外注意事项
如果你的日期字段包含时间部分(比如2024-05-20 14:30:00),而你只想比较日期部分的话,可以用DATE()函数截断时间:
SELECT t1.company_id, DATE(t1.expected_checkdate) AS expected_date, DATE(t2.actual_checkdate) AS actual_date FROM t1 INNER JOIN t2 ON t1.company_id = t2.company_id WHERE DATE(t1.expected_checkdate) = DATE(t2.actual_checkdate) OR ABS(DATEDIFF(DATE(t1.expected_checkdate), DATE(t2.actual_checkdate))) <= 10;
这样就能确保不会因为时分秒的差异导致本该匹配的记录被过滤掉啦~
内容的提问来源于stack exchange,提问作者Victor Udeshi
相关产品推荐
相关产品推荐

