哪里条件。 != 在两个字段中

Where conditions. != in two fields

这个查询给了我想要的东西,但它不是很好 ;)

select *
from sel, (
    select * from sel where ttype = 15) as dl15
where ttype = 16
and sel.code = dl15.code
and convert(varchar,dl15.vdate,0)+convert(varchar, dl15.vtime,0) !=
    convert(varchar,sel.vdate,0)+convert(varchar, sel.vtime,0)

也许有人可以帮我把这个条件convert(varchar,dl15.vdate,0)+convert(varchar, dl15.vtime,0) != convert(varchar,sel.vdate,0)+convert(varchar, sel.vtime,0)转换成更正确的形式

子查询结果:

id          code    vdate               vtime
2000983484  3374347 Feb  1 2020 12:00AM Dec 30 1899  7:05PM

没有最后条件的结果

id          code    vdate               vtime
2000983885  3374347 Feb  6 2020 12:00AM Dec 30 1899  8:00AM
2000983485  3374347 Feb  1 2020 12:00AM Dec 30 1899  7:43PM
2000952328  3374347 Feb  1 2020 12:00AM Dec 30 1899  7:05PM

需要结果

id          code    vdate               vtime
2000983885  3374347 Feb  6 2020 12:00AM Dec 30 1899  8:00AM
2000983485  3374347 Feb  1 2020 12:00AM Dec 30 1899  7:43PM

这个更好:

select *
from sel
join (select * from sel where ttype = 15) as dl15
on sel.code = dl15.code
and  convert(varchar,dl15.vdate,0)+convert(varchar, dl15.vtime,0) !=
     convert(varchar,sel.vdate,0)+convert(varchar, sel.vtime,0)
where ttype = 16 -- here add an table alias sel or dl15

假设:

  • vdate/vtime 属于 datetime 类型,包括要忽略的 (milli/micro) 秒(因此 convert(...,0)
  • 需要两个表中的所有列

一个查询思路:

select s15.*,s16.*
from   sel s15
join   sel s16
on     s15.code  = s16.code
and    s15.ttype = 15
and    s16.ttype = 16
where (   convert(varchar,s15.vdate,0) != convert(varchar,s16.vdate,0)
       or convert(varchar,s15.vtime,0) != convert(varchar,s16.vtime,0)
      )

where 子句的变体,因为 smalldatetime 精确到分钟(即 smalldatetime 没有秒):

where (   convert(smalldatetime,s15.vdate) != convert(smalldatetime,s16.vdate)
       or convert(smalldatetime,s15.vtime) != convert(smalldatetime,s16.vtime)
      )

如果 vdate/vtime 属于 smalldatetime 类型,那么就不需要调用 convert():

where (   s15.vdate != s16.vdate
       or s15.vtime != s16.vtime
      )