Sql Server日期查询无法正常工作

时间:2014-02-14 08:03:17

标签: sql sql-server tsql

我有一个查询,如下所示。但是,当我运行此查询时,我得到的行[date_effective]早于2014年2月14日。为什么?我的日期是1980年1月1日出现的。

  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 个答案:

答案 0 :(得分: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 

答案 1 :(得分: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 :(得分: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

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

  1. “OR”版本查询有两个运算符(Steam聚合和合并连接),而“UNION ALL”版本只有连接运算符。
  2. “OR”版本查询的基数估算值不准确。
  3. “UNION ALL”查询的子树成本低于“OR”版本。