【问题标题】:WHERE clause returning incorrect recordsWHERE 子句返回不正确的记录
【发布时间】:2012-06-08 14:39:16
【问题描述】:

我正在使用这个

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

这个说法有问题吗?

【问题讨论】:

  • 您能否显示它选择的不应选择的一两个示例行?
  • ACTISSUEDATEACTSTARTDATE 日期时间吗?
  • 您检查过您的@Year_Filter_Start@Year_Filter_End 设置的值吗?
  • @marc_s - 如果 op 实际使用 GETDATE(),那么它的 '20111231''20120604',我检查了
  • @Lamak:谁知道 OP 的服务器可能有什么日期/时间......

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


【解决方案1】:

你的 where 查询应该是

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

希望这行得通...

【讨论】:

    【解决方案2】:

    你的 Where 子句应该是

    ACTISSUEDATE 为 NULL 或(@Year_Filter_Start 和 @Year_Filter_End 之间的ACTSTARTDATE)

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          【解决方案5】:

          试试下面的,我觉得你还需要几个括号:

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

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

          【讨论】:

            【解决方案6】:

            它可能会奇怪地处理 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
            

            【讨论】:

            • 在他给出的例子中,ACTISSUEDATE 不为空。
            • 是的,但如果有空值,我总是觉得使用 ISNULL 更可靠。
            【解决方案7】:

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

            将你的位置改为 AND 而不是 OR

            【讨论】:

              猜你喜欢
              • 2014-09-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-12-08
              • 1970-01-01
              相关资源
              最近更新 更多