2011-12-25 4 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

+0

기존 쿼리를 게시 한 경우 도움이됩니다. –

+0

C++의 쿼리입니다. –

답변

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'앞에 오면 쿼리 결과가 반환되지 않습니다. 또한 날짜의 개별 구성 요소가 유효하다는 어떠한 검증도 표시하지 않았습니다.

관련 문제