在我的表中,我有118条记录细节项目。我在这里关注的两个领域是startdate和enddate。
我需要根据此视图生成一份报告,其中显示哪些项目在以下日期范围之间“有效”:
01/01/2011 - 01/12/2011
我尝试过以下WHERE clase:
WHERE startdate BETWEEN '01/04/2011' AND '01/12/2011'
OR enddate BETWEEN '01/04/2011' AND '01/12/2011'
OR startdate <= '01/04/2011' AND enddate >= '01/12/2011'
通过的内容似乎不正确,只显示了一些记录,而且我所知道的许多记录都不会显示,例如一个项目的开始日期为20/07/2011,结束日期为21 / 11/2011在运行WHERE查询时消失。
任何人都可以看到此WHERE查询的错误
答案 0 :(得分:5)
WHERE
startdate <= '2011-12-01'
AND enddate >= '2011-01-01'
(假设enddate中的值是项目活动的最后日期)
使用数字的示例,搜索重叠100到200的任何内容......
Start | End | Start <= 200 | End >= 100
000 | 099 | Yes | No
101 | 199 | Yes | Yes (HIT!)
201 | 299 | No | Yes
000 | 150 | Yes | Yes (HIT!)
150 | 300 | Yes | Yes (HIT!)
000 | 300 | Yes | Yes (HIT!)
这绝对需要逻辑中的AND:)
就您的查询而言......
您的带括号的查询,看起来像这样......
WHERE
(
startdate BETWEEN '01/04/2011' AND '01/12/2011'
OR enddate BETWEEN '01/04/2011' AND '01/12/2011'
OR startdate <= '01/04/2011'
)
AND enddate >= '01/12/2011'
但是你的例子永远不会满足最后的AND条件。尝试添加括号以更明确...
WHERE
(startdate BETWEEN '01/04/2011' AND '01/12/2011')
OR (enddate BETWEEN '01/04/2011' AND '01/12/2011')
OR (startdate <= '01/04/2011' AND enddate >= '01/12/2011')
答案 1 :(得分:1)
在查询之前添加
set dateformat dmy
也可以添加一些括号
WHERE
(startdate BETWEEN '01/01/2011' AND '01/12/2011')
OR
(enddate BETWEEN '01/01/2011' AND '01/12/2011')
OR
(startdate <= '01/01/2011' AND enddate >= '01/12/2011')
答案 2 :(得分:0)
假设startdate
和enddate
是日期字段,
试试这个:
WITH Dates AS (
SELECT [Date] = @StartDate
UNION ALL SELECT [Date] = DATEADD(DAY, 1, [Date])
FROM Dates WHERE [Date] <= DATEADD(DAY, -1, @EndDate)
)
-- YOUR SELECT STATEMENT
-- YOUR FROM STATEMENT
CROSS APPLY Dates
WHERE [Date] BETWEEN startdate AND enddate
-- The rest of your where statement here
OPTION(MAXRECURSION 0);
将您的开始日期声明为01/01/2011
,将结束日期声明为01/12/2011
答案 3 :(得分:0)
当你可以将字符串与列进行比较时,每个人都会以错误的方式将startdate和enddate与字符串进行比较。以下是确定您想要的最简单的方法:
where ( '01/04/2011' between startdate and enddate
or '01/12/2011' between startdate and enddate
)
答案 4 :(得分:0)
我的原始查询正在运行,但我连接的数据库与我的查询有不同的日期格式。