2011-12-25 63 views
0

我有幾個文本框,其中用戶可以添加日期條件,然後他得到的表,其中textbox1<year<textbox2 and textbox2<month<textbox3 and textbox4<day<textbox5 and textbox6<hour<textbox7 and textbox8<minute<textbox9如何讓此查詢更簡單?

如何使查詢更簡單(沒有在它很多IF-ELSE的)?

QString request::date_search(QString type, int y1, int y2, int mon1, int mon2, 
          int d1, int d2, int h1, int h2, int min1, int min2) 
{ 
    QString req = "DATE("+type+") "; 
    QString temp; 
    if (((y1==0) && (mon1==0) && (d1==0) && (h1==0) && (min1==0)) && 
     ((y2==0) && (mon2==0) && (d2==0) && (h2==0) && (min2==0))) 
    { 
    return ""; 
    } 

    if ((y1==0) && (mon1==0) && (d1==0) && (h1==0) && (min1==0)) 
    { 
    return req += "= '" + temp.setNum(y2) + "-" + temp.setNum(mon2) + "-" + 
          temp.setNum(d2) + "-" + temp.setNum(h2) + "-" + 
          temp.setNum(min2) + "-" + "0'"; 
    } 
    if ((y2==0) && (mon2==0) && (d2==0) && (h2==0) && (min2==0)) 
    { 
    return req += "= '" + temp.setNum(y1) + "-" + temp.setNum(mon1) + "-" + 
          temp.setNum(d1) + "-" + temp.setNum(h1) + "-" + 
          temp.setNum(min1) + "-" + "0'"; 
    } 

    req += "BETWEEN '" + temp.setNum(y2) + "-" + temp.setNum(mon2) + "-" + 
         temp.setNum(d2) + "-" + temp.setNum(h2) + "-" + 
         temp.setNum(min2) + "-" +"0' " 
     + "AND" + "'" + temp.setNum(y1) + "-" + temp.setNum(mon1) + "-" + 
         temp.setNum(d1) + "-" + temp.setNum(h1) + "-" + 
         temp.setNum(min1) + "-" + "0'"; 

    return req; 
} 

這是一個函數,其中y1等是來自文本框的參數。

+0

什麼是應用程序代碼語言? – davogotland 2011-12-25 01:15:03

+0

如果您完整地發佈現有查詢,這將有所幫助。 – 2011-12-25 01:15:19

+0

這是一個在C++中的查詢 – 2011-12-25 01:16:35

回答

0

顯然,你需要創建一個函數從零部件格式化日期:

// Are you sure you don't need colons between hour and minute and second? 
// What is the punctuation between the date and the time? 
QString request::date_string(int yy, int mo, int dd, int hh, int mi) 
{ 
    QString temp; // Why? 
    return "'" + temp.setNum(yy) + "-" + temp.setNum(mo) + "-" + 
       temp.setNum(dd) + "-" + temp.setNum(hh) + "-" + 
       temp.setNum(mi) + "-" + "0'"; 
} 

QString request::date_search(QString type, int y1, int y2, int mon1, int mon2, 
          int d1, int d2, int h1, int h2, int min1, int min2) 
{ 
    if ((y1 == 0 && mon1 == 0 && d1 == 0 && h1 == 0 && min1 == 0) && 
     (y2 == 0 && mon2 == 0 && d2 == 0 && h2 == 0 && min2 == 0)) 
     return ""; 

    QString req = "DATE(" + type + ") "; 

    if (y1 == 0 && mon1 == 0 && d1 == 0 && h1 == 0 && min1 == 0) 
     return req += "= " + date_string(y2, mon2, d2, h2, min2); 
    if (y2 == 0 && mon2 == 0 && d2 == 0 && h2 == 0 && min2 == 0) 
     return req += "= " + date_string(y1, mon1, d1, h1, min1); 

    return req += "BETWEEN " + date_string(y2, mon2, d2, h2, min2) + 
       " AND " + date_string(y1, mon1, d1, h1, min1); 
} 

這多少是一個沒有腦子在我看來。我不清楚你爲什麼需要變量temp;不過,我認爲這是必要的。我會擔心在DATE值的時間組件之間不使用冒號。我不確定在一天和一小時之間應該使用哪個分隔符(ISO 8601將使用'T'; ISO 9075(SQL)將使用空白'')。在測試中你也不需要太多括號。

但是,這是簡單的C++編碼風格;幕後的查詢不會變得簡單得多。請注意,在顯示的代碼中,'date1'(創建自y1,... min1)的值在'date2'之前,那麼查詢將不會返回任何結果。您還沒有顯示日期的各個組件是否有效的驗證。