【问题标题】:SQL Datetime Not Equal To Is Not WorkingSQL 日期时间不等于不工作
【发布时间】:2012-04-19 12:33:06
【问题描述】:

我有一个由 Customer、Product 和 Transaction 表组成的数据库。

我正在尝试编写一条 SQL 语句来列出所有在 2000 年没有进行交易的客户的姓名和 SSN。

Transaction 表中的 TransactionDate 列是日期/时间数据类型(例如 2000-12-18 00:00:00)。

这是我写的 SQL 代码:

SELECT DISTINCT CustomerName, Customer.CustomerSSN 
FROM Customer, Transaction
WHERE Customer.CustomerSSN=Transaction.CustomerSSN
AND YEAR(TransactionDate)<>2000;

不等于符号 () 似乎由于某种原因不起作用。当我将其更改为等号时,它确实返回了正确的结果...

感谢任何建议。

【问题讨论】:

  • 定义“不工作”。你有年份 2000 年的记录吗?
  • 您的 SQL 查询中的逻辑与您对问题的陈述不符。它返回具有 2000 年以外交易的客户即使他们在 2000 年也有交易(不是您想要的)。下面的答案都是得到你想要的结果的所有方法。

标签: mysql sql database relational-database


【解决方案1】:

我会改变方法。

以下查询不需要distinctGROUP BY,因为没有任何客户记录与多条交易记录相连。

它也适用于从未进行过任何交易的客户。

最后,它使用&gt;= AND &lt; 而不是YEAR()=2000。这将启用索引查找而不是全扫描(假设您在 transactions 表上有适当的索引)

SELECT
  CustomerName,
  CustomerSSN
FROM
  Customer
WHERE
  NOT EXISTS (
    SELECT *
      FROM Transaction
     WHERE CustomerSSN      = Customer.CustomerSSN
       AND TransactionDate >= '20000101'
       AND TransactionDate <  '20010101'
  )

【讨论】:

    【解决方案2】:
    SELECT DISTINCT
        Customer.CustomerName, 
        Customer.CustomerSSN
    FROM Customer
    LEFT JOIN Transaction
        ON Customer.CustomerSSN=Transaction.CustomerSSN
        AND YEAR(TransactionDate) = 2000
    WHERE Transaction.TransactionDate IS NULL
    

    此查询将交易连接到客户,但具体连接的是 2000 年的 Transactions。任何没有来自 Transactions 的修补记录的客户因此在该年没有交易。因此,您正在寻找Transaction.TransactionDate IS NULL

    在您自己的查询中,您只是查找在 2000 年以外的年份进行过交易的任何客户,但有些客户也可能在 2000 年内进行过交易。

    【讨论】:

      【解决方案3】:
      SELECT CustomerName, CustomerSSN 
      FROM Customer
      WHERE CustomerSSN NOT IN (
      SELECT CustomerSSN
      FROM Transaction
      WHERE Year(TransactionDate)=2000);
      

      【讨论】:

      • WHERE TransactionDate=2000 不起作用。你的意思是复制YEAR(TransactionDate)=2000?如果是这样,还要注意这不是 SARGable。
      【解决方案4】:

      我知道它已解决,但仍想在此处发布此作为附加答案(可能对其他人有帮助)。

      解决此问题的另一种方法是使用 NULLIF 运算符,这是对原始查询的最小修改,我认为如果 不起作用,它是一个更好的替代方法。

      SELECT DISTINCT CustomerName, Customer.CustomerSSN 
      FROM Customer, Transaction
      WHERE Customer.CustomerSSN=Transaction.CustomerSSN
      AND (NULLIF(YEAR(TransactionDate), 2000) IS NOT NULL)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多