【问题标题】:Misunderstanding during DATE comparison sqlDATE比较sql过程中的误区
【发布时间】:2012-12-12 19:50:02
【问题描述】:

我正在使用 SQL Server 2012 数据库,我正在尝试检索所有员工 ID,以及在 2008 年 2 月 2 日没有处理订单的名字,我遇到了这样的问题

Select 
    Distinct E.empid, E.firstname
from 
    HR.Employees E 
where  
   E.empid in (Select empid
               From Sales.Orders As S
               where orderdate <> '20080212') 

此查询返回所有员工 ID 和名字,但此查询仅返回当天处理订单的雇员 ID

Select Distinct E.empid, E.firstname
    from HR.Employees E 
    where  E.empid in (Select  empid
    From Sales.Orders As S
    where  orderdate  = '20080212')

我知道问题在于过滤orderdate,但你能告诉我,我做错了什么

【问题讨论】:

  • 尝试更改第二个查询,将NOT IN 替换为IN
  • 您是指 2008 年 2 月 12 日,还是要与 `orderdate = '20080202' 进行比较?
  • 我想要除 orderdate = '20080202'. I can't understand why orderdate 之外的所有日期 '20080202' 不起作用

标签: sql date sql-server-2012


【解决方案1】:

问题在于你的逻辑。没有员工只在该日期处理订单。您的第一个查询是获取在除该日期之外的任何日期有订单的所有员工。

你想要的第一个查询是:

Select Distinct E.empid, E.firstname
from HR.Employees E 
where  E.empid not in (Select  empid
From Sales.Orders As S
where  orderdate  = '20080212') 

第一个查询中的子查询获取在 2008 年 2 月 12 日以外的日期工作的所有员工。大概是所有员工。好吧,有人可能会在那天开始并辞职或被解雇,但这并没有发生。

您想要排除当天工作的所有员工。因此,您需要在子查询中添加一个“=”,然后使用 not in 排除它们。

【讨论】:

  • 这正是我想要的,但你能更准确地向我解释我的错误吗没有员工只在那个日期处理订单我不太明白你的这部分回复
【解决方案2】:

我假设这是一个 DataTime 列而不是 Date 列。作为 DateTime,您要求的是在某一时刻而不是一整天都没有接受订单的员工。有很多变体可以处理这个问题,但我会使用的一种是

Select Distinct E.empid, E.firstname
    from HR.Employees E 
    where  E.empid in (Select  empid
    From Sales.Orders As S
    where  orderdate  >= '20080212'
           and
           orderdate < '20080213')

【讨论】:

  • 在这种情况下,我只得到处理订单的员工,而我想要完全相反
  • 鉴于= 的查询有效,这不是问题。
  • @automatic:我也更喜欢 &lt;= and &lt; 与日期数据类型的比较,但您有一个错字:没有 =&gt; 运算符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-14
  • 1970-01-01
  • 1970-01-01
  • 2012-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多