请参阅附图
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分开存储表,但如果我可以使用查询吗?
你也可以告诉我这是不可能的。
答案 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)) )