DATE比较sql期间的误解

时间:2012-12-12 19:50:03

标签: sql date sql-server-2012

我正在使用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和名字,但此查询仅返回当天处理订单的雇佣人员

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,但你能告诉我们我做错了吗

2 个答案:

答案 0 :(得分:4)

问题在于你的逻辑。没有员工只在该日处理订单。您的第一个查询是让所有在该日期之前有订单的员工。

第一个查询的目的是:

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-02-12之外的其他日期工作的员工。据推测,这就是所有员工。好吧,有人本可以在那天开始戒烟或被解雇,但事情没有发生。

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

答案 1 :(得分:0)

我假设这是一个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')