5

我正在使用这个

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

这个说法有问题吗?

4

7 回答 7

1

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

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

引擎将其视为您拥有的两个语句。你需要做一个。

于 2012-06-24T02:19:05.287 回答
0

你的 Where 子句应该是

WHERE ACTISSUEDATE 为 NULL 或(ACTSTARTDATE BETWEEN @Year_Filter_Start AND @Year_Filter_End)

于 2012-12-20T15:56:56.063 回答
0

你应该在哪里查询

WHERE ACTISSUEDATE is null 
    OR (ACTISSUEDATE is not null 
    and ACTSTARTDATE BETWEEN @Year_Filter_Start AND @Year_Filter_End)

希望这有效...

于 2013-01-22T08:14:29.943 回答
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
于 2012-06-21T13:30:19.897 回答
0

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

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

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

于 2012-07-17T19:47:20.247 回答
0

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

更改您的位置 AND 而不是 OR

于 2012-06-21T12:28:12.023 回答
0

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

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

于 2012-06-21T13:11:11.170 回答