我正在使用这个
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
这句话有什么问题吗?
答案 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)
答案 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)
希望这有效......