2010-06-11 65 views
1

請參見附件圖像找到兩者之間的日期範圍

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

我有有沒有fromdate和todate表中的記錄。 FromDate是某個事件的開始,ToDate是該事件的結束。如果搜索條件在日期範圍之間,我需要查找記錄。

例如

如果一條記錄有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那麼結果是確定如如果搜索criterai是DateFrom = 2010/5/15 AND DateTo = 2010/5/18那麼這條記錄將返回因爲Date From就是從數據庫中的DateFrom。

OR

如果搜索條件是DateFrom = 2010年5月22日和DateTo = 2010年5月25日則此記錄將返回,因爲終止日期是究竟什麼是DateTo在DB

但是如果有的在此範圍之間它不起作用

感謝您的幫助。

編輯:

我不能使用< =或>,因爲這會帶來所有其他記錄這比搜索條件的日期是小於大。

我只想獲取這些日期的記錄 E.g. FromDate = 2010/5/15和DateTo = 2010/5/25這是日期範圍,但事件在所有日期之間,因此一種解決方案是將2010年5月15日至2010年5月25日的所有日期分開存儲表,但如果我可以使用查詢做到這一點?

你也可以告訴我,這是不可能的。

回答

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, [email protected]), 0)) 
      AND (DATEADD(DAY, DATEDIFF(DAY, 0, m.EventDateTo), 0) >= DATEADD(DAY, DATEDIFF(DAY, 0, [email protected]), 0)) 
     ) 
+0

這工作,但你能告訴我什麼原因使用DATEADD和DATEDIFF函數0,因爲0會對日期沒有影響。謝謝您的幫助。 – Kashif 2010-06-11 14:01:20

+0

我發現你發佈的圖片中有日期與他們相關的時間。 DATEADD和DATEDIFF功能如圖所示使用時,將所有日期的時間值設置爲午夜。實際上,它將時間消除爲一個因素。或者,您可以將@天添加到@DateTimeTo並將比較結果更改爲<。如果您不隨時間採取這種預防措施,您可能會因爲時間值大於午夜而丟棄記錄。我希望我解釋得很清楚。這只是SQLMenace發佈的鏈接中討論的問題的另一種解決方案。 – NYSystemsAnalyst 2010-06-11 15:48:38

+0

謝謝,很好的幫助。 – Kashif 2010-06-11 18:46:16

1

爲什麼在轉換爲字符串時不使用ISO格式,話雖如此,由於您的查詢不可SARGable,請您閱讀How Does Between Work With Dates In SQL Server?它會告訴您必須使用EventDate> = ... AND EVENTDATE < ....

+0

感謝您的幫助。請參閱我的編輯問題。 – Kashif 2010-06-11 12:32:10

+0

之間是> =和<=因此,在1和3之間是相同的> = 1和<= 3 – SQLMenace 2010-06-11 12:57:29

0

第二NTSystemAnalyst的帖子,試試這個選項:

SELECT m.EventId FROM MajorEvents爲M WHERE(
((m.LocationID = @locationID)OR(@locationID IS NULL)) OR(m.LocationID IS NULL) )

AND( 米。EventDateFrom < DATEADD(dd,1,CONVERT(varchar(10),@ DateTimeTo,23)) AND m.EventDateTo> DATEADD(dd,-1,CONVERT(varchar(10),@ DateTimeFrom,23)) )

相關問題