2014-02-14 67 views
0

我有一个查询,如下所示。但是,当我运行这个查询时,我得到了[date_effective]在2014年2月14日之前的行。为什么?我有日期1/1/1980出现。Sql Server日期查询不起作用

SELECT * 
    FROM D_CORPACTIONS_MSCI 
    WHERE [date_effective] >= '14 February 2014' 
    AND [ca_status] = 'EXPECTED' 
     OR [ca_status] = 'CONFIRMED' 
     OR [ca_status] = 'UNDETERMINED' 
ORDER BY [date_effective] 
+3

基本上,你问的是 - 给我行,那 - 有'date_effective'> = 14Feb2014和'ca_status'是''EXPECTED'' 和行,那 - 有''ca_status' 'CONFIRMED''或''UNDETERMINED'',**不管'date_effective'是否有**。 – Alexander

回答

2

andor是冲突的对方。

因此匹配的行不正确。

尝试封装or陈述或者,它这种情况下,使用in

select * 
from d_corpactions_msci 
where date_effective >= '14 february 2014' 
and ca_status in ('EXPECTED', 'CONFIRMED', 'UNDETERMINED') 
order 
by  date_effective 

而且,不依赖对客户端或服务器的日期格式通过转换日期:

where date_effective >= convert(datetime, '20140214', 112) 
2
SELECT * 
FROM d_corpactions_msci 
WHERE (date_effective >= '14 February 2014') 
     AND (ca_status = 'EXPECTED' 
       OR ca_status = 'CONFIRMED' 
       OR ca_status = 'UNDETERMINED') 
ORDER BY date_effective 
0

Patrick Hofman和Kashif - 他们已经回答了您的问题。

您还可以使用UNION ALL

SELECT * 
    FROM D_CORPACTIONS_MSCI 
    WHERE ([date_effective] >= '14 February 2014') 
    AND [ca_status] = 'EXPECTED' 
UNION ALL 
    SELECT * 
    FROM D_CORPACTIONS_MSCI 
    WHERE ([date_effective] >= '14 February 2014') 
    AND [ca_status] = 'CONFIRMED' 
UNION ALL 
    SELECT * 
    FROM D_CORPACTIONS_MSCI 
    WHERE ([date_effective] >= '14 February 2014') 
    AND [ca_status] = 'UNDETERMINED') 
ORDER BY [date_effective] 

UNION ALL进行比OR更好。

比较 - “或”与“UNION ALL”我的理解按如下:

  1. 的“OR”版本的查询有两个运营商(蒸汽聚集和合并联接),而“UNION ALL”版本有仅限连接运算符。
  2. “OR”版本查询的基数估计不准确。
  3. “UNION ALL”查询的子树成本少于“OR”版本。
+0

为什么所有的开销? –

+0

嗨帕特里克,我认为联盟所有表现比或更好 比较 - “或”与“联盟所有” 我的理解如下: 1.“OR”版本查询有两个运算符(蒸汽聚合和合并加入)而“UNION ALL”版本只有连接运算符。 2.“OR”版本查询的基数估计不准确。 3.“UNION ALL”查询的子树成本小于“OR”版本。 –

+0

来源:来源:http://webcache.googleusercontent.com/search?q=cache:qBH7HSQJLa0J:sqltouch.blogspot.com/2013/03/or-vs-union-all-have-you-thought-about.html +&cd = 4&hl = en&ct = clnk&gl = uk –