You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL语句报错:Operand type clash: date与int不兼容(NOT IN子查询)

解决Operand type clash: date is incompatible with int报错

这个类型冲突错误的原因特别直接:你在外层查询里用B.ContactID(整数类型)去和子查询返回的B.DepartureDate(日期类型)做比较,这俩数据类型完全不兼容,数据库肯定会抛出Operand type clash的错误。

问题根源分析

原SQL的NOT IN子查询写的是SELECT B.DepartureDate FROM Booking B WHERE B.DepartureDate >= '2018-04-26',但你的实际需求应该是排除那些有DepartureDate晚于2018-04-26的预订的ContactID,所以子查询应该返回ContactID而不是DepartureDate。

修正后的SQL

只需要把子查询里的返回字段从B.DepartureDate改成B.ContactID就可以解决问题,完整代码如下:

SELECT 
    Br.BusinessDivision,
    B.BookingDate, 
    B.DepartureDate, 
    B.CustomerID, 
    C.FirstName, 
    C.SurName 
FROM Booking B 
INNER JOIN Customer C ON C.ContactID = B.ContactID 
INNER JOIN Branch Br ON Br.BranchID = B.BranchID 
WHERE 
    B.BookingDate BETWEEN '2015-04-01' AND '2018-04-26' 
    AND Br.BusinessDivision IN ( 'Retail', 'TVSales' ) 
    AND B.ContactID NOT IN ( 
        SELECT B.ContactID  -- 替换为正确的字段
        FROM Booking B 
        WHERE B.DepartureDate >= '2018-04-26' 
    );

更可靠的替代方案:使用NOT EXISTS

如果你的Booking表中ContactID可能存在NULL值,NOT IN会因为NULL的存在导致整个条件失效(因为任何值和NULL比较都返回未知)。这种情况下,推荐用NOT EXISTS来替代,逻辑更清晰也更稳定:

SELECT 
    Br.BusinessDivision,
    B.BookingDate, 
    B.DepartureDate, 
    B.CustomerID, 
    C.FirstName, 
    C.SurName 
FROM Booking B 
INNER JOIN Customer C ON C.ContactID = B.ContactID 
INNER JOIN Branch Br ON Br.BranchID = B.BranchID 
WHERE 
    B.BookingDate BETWEEN '2015-04-01' AND '2018-04-26' 
    AND Br.BusinessDivision IN ( 'Retail', 'TVSales' ) 
    AND NOT EXISTS ( 
        SELECT 1  -- 这里用SELECT 1比SELECT字段更高效
        FROM Booking B2 
        WHERE B2.ContactID = B.ContactID  -- 关联外层的ContactID
          AND B2.DepartureDate >= '2018-04-26' 
    );

这里给子查询的表起了别名B2,避免和外层的B混淆,逻辑是“不存在同一个ContactID的预订,其DepartureDate晚于2018-04-26”,和原需求完全匹配,同时规避了NULL的问题。

内容的提问来源于stack exchange,提问作者user7774424

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:46:39