WHERE子句返回不正确的记录

时间:2012-06-04 14:09:03

标签: sql sql-server tsql sql-server-2005 datetime

我正在使用这个

DECLARE @Year_Filter_Start AS DATETIME
SET @Year_Filter_Start = DATEADD( dd, -1, DATEADD( yy, DATEDIFF( yy, 0, GetDate() ), 0 ) )
DECLARE @Year_Filter_End AS DATETIME
SET @Year_Filter_End = GetDate()

INSERT INTO TABLE
  ( blah )
SELECT blah
  FROM OTHER_TABLE
 WHERE ACTISSUEDATE IS NULL 
    OR ACTSTARTDATE BETWEEN @Year_Filter_Start AND @Year_Filter_End

并返回记录,其中ACTISSUEDATE不为空且ACTSTARTDATE不在年份开始和今天之间。 @Year_Filter_Start应该是今年的开始,@ Year_Filter_End应该是今天。

例如:

ACTSTARTDATE为2010-08-02且ACTISSUEDATE为2011-03-15的记录

或者ACTSTARTDATE是2009-05-18,ACTISSUEDATE是2009-09-06

这句话有什么问题吗?

7 个答案:

答案 0 :(得分:1)

尝试以下内容,我认为还需要更多的括号:

WHERE ((ACTISSUEDATE IS NULL)  
    OR (ACTSTARTDATE BETWEEN @Year_Filter_Start AND @Year_Filter_End))

引擎会将此视为两种语句。你需要做一个。

答案 1 :(得分:0)

首先 你想要两个条件都是真的还是其中之一 其次 它为您提供ACTISSUEDATE不为空的记录,因为这些记录在年份开始和今天之间具有ACTSTARTDATE。那些ACTSTARTDATE不在年份开始和今天之间的记录的ACTISSUEDATE为NULL。

将您的位置更改为AND而不是OR

答案 2 :(得分:0)

当两个条件之一为where时,您的True子句将返回一个值。 现在,在您的示例中,您告诉ACTISSUEDATE不为空,因此即使ACTSTARTDATE不在您的日期之间,它也会返回该值。

要满足这两个条件,请将WHERE子句中的OR更改为AND。

答案 3 :(得分:0)

它可能奇怪地处理NULLS(很难说没有样本数据)。

我会尝试改变:

WHERE ACTISSUEDATE IS NULL 
OR ACTSTARTDATE BETWEEN @Year_Filter_Start AND @Year_Filter_End

要:

WHERE ISNULL(ACTISSUEDATE, @Year_Filter_End) BETWEEN @Year_Filter_Start AND @Year_Filter_End

答案 4 :(得分:0)

我看到你用sql server 2005标记了你的问题。鉴于我想指出BETWEEN键值是包含端点的。因此,如果您只想要年初,则应将日期计算更改为

    DATEADD(yy, DATEDIFF(yy, 0, GetDate()), 0)

http://msdn.microsoft.com/en-us/library/ms187922.aspx

答案 5 :(得分:0)

你的Where子句应该是

ACTISSUEDATE为空时     或(@Year_Filter_Start与@Year_Filter_End之间的ACTSTARTDATE)

答案 6 :(得分:0)

你的查询应该在哪里

WHERE ACTISSUEDATE is null 
    OR (ACTISSUEDATE is not null 
    and ACTSTARTDATE BETWEEN @Year_Filter_Start AND @Year_Filter_End)
希望这有效......