2014-02-14 4 views
0

У меня есть запрос, показанный ниже. Однако, когда я запускаю этот запрос, я получаю строки, чей [date_effective] - до 14 февраля 2014 года. Почему? У меня есть даты появления 1/1/1980.Sql Server Date Query не работает

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

Ваш and и or конфликтуют друг с другом.

Поэтому соответствующие строки не соответствуют действительности.

Try инкапсулировать 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

Патрик Хофман и Кашиф - они уже ответили на ваш вопрос.

Вы также можете использовать 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. «ИЛИ» версия запроса имеет два оператора (агрегацию пары и слияние), тогда как «UNION ALL» версия имеет оператор конкатенации.
  2. Оценка кардинальности неточна для запроса версии «ИЛИ».
  3. Стоимость поддерева для запроса «UNION ALL» меньше, чем версия «ИЛИ».
+0

Почему все накладные расходы? –

+0

Привет Патрик, я думал, что UNION ALL работает лучше, чем OR Сравнения - «ИЛИ» против «UNION ALL» Моего понимания согласно ниже: 1. «ИЛИ» версия запроса имеет два оператора (агрегацию пары и слияние join), тогда как версия «UNION ALL» имеет только оператор конкатенации. 2. Оценка кардинальности неточна для запроса версии «ИЛИ». 3. Стоимость поддерева для запроса «СОЮЗ ВСЕ» меньше, чем версия «ИЛИ». –

+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 –