2014-02-14 95 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 –