SQL WHERE查询日期范围

时间:2011-12-02 14:49:31

标签: sql sql-server syntax reporting-services where-clause

在我的表中,我有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查询的错误

enter image description here

5 个答案:

答案 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)

假设startdateenddate是日期字段,

试试这个:

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)

我的原始查询正在运行,但我连接的数据库与我的查询有不同的日期格式。