2012-08-02 73 views
0

兩個日期字段我已經在數據庫中,project_start和project_end兩列,我在路過兩個領域(選購件)通過報告(在ASP編碼)。比較兩個日期參數

下面的僞碼是我目前有:

(project_start < = search_start AND project_end < = search_start)

AND

(project_start < = search_end AND project_end> = search_end)

但是上面有哪些不拿起是其開始日期之前開始的項目,但開始日期之後結束,其項目啓動壓腳提升的開始日期,但最終結束日期之後,也該結束日期的開始日期和結束前啓動項目:S

下面是我的代碼:

if (Request.QueryString["DateFrom"] != null && Request.QueryString["DateFrom"] != "") 
     { 
      DateTime dateFromFilter; 

      dateFromFilter = DateTime.Parse(Request.QueryString["DateFrom"]); 

      Q = from qua in qTable 
        where qua.Start_Date.Date <= dateFromFilter.Date 
        && qua.End_Date.Date >= dateFromFilter.Date 
        select qua; 
     } 

     //filter to date 
     if (Request.QueryString["DateTo"] != null && Request.QueryString["DateTo"] != "") 
     { 
      DateTime dateToFilter; 

      dateToFilter = DateTime.Parse(Request.QueryString["DateTo"]); 

      Q= from qua in qTable 
        where qua.Start_Date.Date <= dateToFilter.Date 
        && qua.End_Date.Date >= dateToFilter.Date 
        select qua; 
     } 
+0

那麼應該不是這些條件一起工作? – V4Vendetta 2012-08-02 10:16:17

+1

你能澄清你的要求好一點嗎?我無法理解您實際上過了哪些日期範圍。我從上面的要求推導出的是,您需要任何有關日期的任何信息。 – 2012-08-02 10:17:34

回答

3

如果你想預測,與你的搜索範圍的任何部分重疊,試試這個:

project_start <= search_end AND project_end >= search_start 

我知道這看起來「太簡單了」,但事實上確實涵蓋所有情況:

  • 兩端部分重疊
  • 該項目完全在搜索範圍內
  • 搜索範圍完全位於項目內部。

更新

要處理可選PARAMATERS:

(search_end IS NULL OR project_start <= search_end) AND 
(search_start IS NULL OR project_end >= search_start) 
+0

這兩個搜索參數都是可選的,所以上面的AND不足以滿足要求。 – stats101 2012-08-02 10:17:47

+0

+1:但也值得一提:這樣的查找往往會掃描桌上非常大的藥水。知道任何時間間隔的最大持續時間可以顯着提高速度:'p_start> = s_start - 31 AND p_start <= s_end AND p_end> = s_start'。 – MatBailie 2012-08-02 10:18:56

+0

@ stats101:修正也處理NULL輸入。 – 2012-08-02 10:20:56

0

當然,你想:

(project_start >= search_start AND project_end >= search_start) 
AND 
(project_start <= search_end AND project_end <= search_end) 

假設project_end> project_start,這可以簡化爲

project_start >= search_start AND project_end <= search_end 

你說的這兩個搜索參數都是可選的,在這種情況下做出search_start默認爲DateTime.MinValue,並search_end默認爲DateTime.MaxValue。