在BETWEEN日期范围中查找记录

时间:2010-06-11 12:03:13

标签: sql sql-server-2005 tsql

请参阅附图

alt text http://img248.imageshack.us/img248/7743/datefrom.png

我有一张包含FromDate和ToDate的表格。 FromDate是某个事件的开始,ToDate是该事件的结束。如果搜索条件介于日期范围之间,我需要找到一条记录。

e.g。

如果记录有FromDate 2010/15/5和ToDate 2010/15/25且我的标准是FromDate 2010/5/18而ToDate是2010/5/21那么这条记录应该在搜索结果中,因为它在范围为15至25。

以下是我的搜索查询(大块)

SELECT   m.EventId
FROM     MajorEvents 

WHERE   (   (m.LocationID = @locationID OR @locationID IS NULL) OR M.LocationID IS NULL)
AND      (
            CONVERT(VARCHAR(10),M.EventDateFrom,23) BETWEEN  CONVERT(VARCHAR(10),@DateTimeFrom,23) AND CONVERT(VARCHAR(10),@DateTimeTo,23) 
            OR
            CONVERT(VARCHAR(10),M.EventDateTo,23) BETWEEN CONVERT(VARCHAR(10),@DateTimeFrom,23) AND CONVERT(VARCHAR(10),@DateTimeTo,23)
        )

如果搜索条件等于FromDate或ToDate,则结果可以为例如如果搜索标准是DateFrom = 2010/5/15 AND DateTo = 2010/5/18那么此记录将返回,因为Date From正好是db中的DateFrom。

OR

如果搜索条件是DateFrom = 2010/5/22 AND DateTo = 2010/5/25,则此记录将返回,因为Date To正好是db中的DateTo

但如果此范围之间的任何内容都不起作用

感谢您的帮助。

修改

我不能使用< =或>因为这将带来所有其他小于和大于搜索条件日期的记录。

我只想获取那些日期的记录 例如。 FromDate = 2010/5/15和DateTo = 2010/5/25这是日期范围,但事件是在所有日期之间,所以一个解决方案是我将所有日期从2010/5/15到2010/5/25分开存储表,但如果我可以使用查询吗?

你也可以告诉我这是不可能的。

3 个答案:

答案 0 :(得分:2)

这个怎么样:

SELECT   m.EventId
FROM     MajorEvents AS m
WHERE   (   
                ((m.LocationID = @locationID) OR (@locationID IS NULL))
            OR  (m.LocationID IS NULL)
        )
    AND (
                (DATEADD(DAY, DATEDIFF(DAY, 0, m.EventDateFrom), 0) <= DATEADD(DAY, DATEDIFF(DAY, 0, m.@DateTimeTo), 0))
            AND (DATEADD(DAY, DATEDIFF(DAY, 0, m.EventDateTo), 0) >= DATEADD(DAY, DATEDIFF(DAY, 0, m.@DateTimeFrom), 0))
        )

答案 1 :(得分:1)

为什么在转换为字符串时不使用ISO格式,如果说,您的查询执行得非常糟糕,因为它不是SARGable,请阅读How Does Between Work With Dates In SQL Server?它会告诉您必须使用的地方EventDate&gt; = ... AND EventDate&lt; ....

答案 2 :(得分:0)

要获得第二个NTSystemAnalyst的帖子,请尝试以下选项:

SELECT m.EventId 来自MajorEvents AS m 在哪里(
    ((m.LocationID = @locationID)OR(@locationID IS NULL))     或(m.LocationID为空)     )

AND(     m.EventDateFrom&lt; DATEADD(dd,1,CONVERT(varchar(10),@ DateTimeTo,23))     和     m.EventDateTo&gt; DATEADD(dd,-1,CONVERT(varchar(10),@ DateTimeFrom,23)) )