Q&A

  • 년 월 일 을 에디터로 받아서 조건검색을 하려는데 부탁해용.^^

혼자 레이아웃하고 만들어서 완전 꽝이지만 끝까지 포기하지 않구 완성하구 싶어서 질문까지 해요..

부탁합니다..^^ 제발 완성하게 해주세요...


우선은 도서관 프로그램이예요..

사람들 입력했구요. 도서명과 도서코드로 책들도 입력했으며 검색까지는 했거든요..

근데 이것들을 통계를 내고 싶어서요.

제 짧은 생각은

select * from BOOK_RENT

where RENT_DAY > 20050000 and RENT_DAY < 20061130

이렇게 검색했더니 검색은 되더라구요.

근데 생각이
with query1 do
   begin
      close;
      sql.clear;
      sql.add('select * from BOOK_RENT  ');
      sql.add('where rent_day >= :rent_day and rent_day < :rent_day1 ');
      paramabyname('rent_day ').asstring := edit1.text;
      paramabyname('rent_day1 ').asstring := edit2.text;

이렇게   paramabyname를 써서 년 월 일 을 받아서 검객하구 싶거든요.
물론 따로 따로 년 월 일 이구요....

2005년 부터 2006년까지
그리고
200611월부터 200612월까지 이렇게 검색해서 해야하는데
여기서 막혀요.
참 필드엔  '20061120' 요런 형태로 정장됐어요.^^ 부탁해용...
2  COMMENTS
  • Profile
    sallyslaw 2006.11.21 01:54
    쿼리를 할 때 Query.add('검색쿼리') 보다는
    Query.sql.text := '검색쿼리' 를 사용하시는 것이 낫겠습니다.

    아래부분 쿼리로만 보자면

    with query1 do
    begin
      close;
      sql.clear;
      sql.text := 'SELECT * '
                   + '  FROM BOOK_RENT '
                   + ' WHERE RENT_DAY BETWEEN ''' + edit1.text + ''''
                   + '     AND ''' + edit2.text + '''';
      //edit1.text 값 : '20061101'
      //edit2.text 값 : '20061231'
      open;
    end;

    우선 날짜 검색 조건은 사용자가 지정하도록 하겠죠.
    TDatetimepicker 를 사용하시면 될 것 같은데..

    검색일자 := formatdatetime('yyyymmdd', Datetimepicker1.datetime);

    사실 아래 질의하신 내용으로는 무엇이 문제인지는 모르겠군요.

    혹 날짜를 지정하는 부분이 문제시면

    아래 function을 참조하세요.

    // 날짜의 년도만 발취
    function TForm1.dateYear(D: TDateTime): Integer;
    var
    Year, Month, Day: Word;
    begin
    DecodeDate(D, Year, Month, Day);
    Result := Year;
    end;

    // 날짜의 월만 발취
    function TForm1.dateMonth(D: TDateTime): Integer;
    var
    Year, Month, Day: Word;
    begin
    DecodeDate(D, Year, Month, Day);
    Result := Month;
    end;

    // 날짜의 일만 발취
    function TForm1.dateDay(D: TDateTime): Integer;
    var
    Year,Month,Day : Word;
    begin
    DecodeDate (D,Year,Month,Day);
    Result := Day;
    end;

    // 년의 시작일자
    function TForm1.dateBeginOfYear(D: TDateTime): TDateTime;
    var
    Year, Month, Day: Word;
    begin
    DecodeDate(D, Year, Month, Day);
    Result := EncodeDate(Year, 1, 1);
    end;

    // 년의 마지막일자
    function TForm1.dateEndOfYear(D: TDateTime): TDateTime;
    var
    Year, Month, Day: Word;
    begin
    DecodeDate(D, Year, Month, Day);
    Result := EncodeDate(Year, 12, 31);
    end;

    // 월의 시작일자
    function TForm1.dateBeginOfMonth(D: TDateTime): TDateTime;
    var
    Year, Month, Day: Word;
    begin
    DecodeDate(D, Year, Month, Day);
    Result := EncodeDate(Year, Month, 1);
    end;

    // 월의 마지막일자
    function TForm1.dateEndOfMonth(D: TDateTime): TDateTime;
    var
    Year, Month, Day: Word;
    begin
    DecodeDate(D, Year, Month, Day);
    if Month = 12 then
    begin
       Inc(Year);
       Month := 1;
    end
    else
       Inc(Month);

    {월의 다음월의 시작일에서 1을 뺀다}
    Result := EncodeDate(Year, Month, 1) - 1;
    end;

    // 년을 기준으로 몇번째 주인지
    function TForm1.dateWeekOfYear(D: TDateTime): Integer;
    const
    t1: array[1..7] of ShortInt = ( -1,  0,  1,  2,  3, -3, -2);
    t2: array[1..7] of ShortInt = ( -4,  2,  1,  0, -1, -2, -3);
    var
    doy1, doy2: Integer;
    NewYear: TDateTime;
    begin
    NewYear := dateBeginOfYear(D);
    doy1 := dateDayofYear(D) + t1[DayOfWeek(NewYear)];
    doy2 := dateDayofYear(D) + t2[DayOfWeek(D)];
    if doy1 <= 0 then
       Result := dateWeekOfYear(NewYear-1)
    else if (doy2 >= dateDayofYear(dateEndOfYear(NewYear))) then
       Result:= 1
    else
       Result:=(doy1-1) div 7+1;
    end;

    // 년을 기준으로 몇번째 일인지
    function TForm1.dateDayOfYear(D: TDateTime): Integer;
    begin
    Result := Trunc(D-dateBeginOfYear(D)) + 1;
    end;

    // 요일 번호
    function TForm1.dateDayOfWeek(D: TDateTime): TDayOfWeek;
    begin
    Result := TDayOfWeek(Pred(DayOfWeek(D)));
    end;

    // 윤년인지 검사
    function TForm1.dateLeapYear(D: TDateTime): Boolean;
    var
    Year, Month, Day: Word;
    begin
    DecodeDate(D, Year, Month, Day);
    Result := (Year mod 4 = 0) and ((Year mod 100 <> 0) or (Year mod 400 = 0));
    end;

    // 주어진 일자가 포함된 분기의 시작일
    function TForm1.dateBeginOfQuarter(D: TDateTime): TDateTime;
    var
    Year, Month, Day: Word;
    begin
    DecodeDate(D, Year, Month, Day);
    Result := EncodeDate(Year, (((Month-1) div 3) * 3)+1, 1);
    end;

    // 주어진 일자가 포함된 분기의 마지막일
    function TForm1.dateEndOfQuarter(D: TDateTime): TDateTime;
    begin
    Result := dateBeginOfQuarter(dateBeginOfQuarter(D)+(3*31)) - 1;
    end;

    // 주의 시작일
    function TForm1.dateBeginOfWeek(D: TDateTime; Weekday: Integer): TDateTime;
    begin
    Result := D;
    while DayOfWeek(Result) <> Weekday do
       Result := Result - 1;
    end;

    // 월의 마지막 일
    function TForm1.dateDaysInMonth(D: TDateTime): Integer;
    const
    DaysPerMonth: array[1..12] of Byte= (31,28,31,30,31,30,31,31,30,31,30,31);
    var
    Month: Integer;
    begin
    Month := dateMonth(D);
    Result := DaysPerMonth[Month];
    if (Month=2) and dateLeapYear(D) then
       Inc(Result);
    end;

    즐코 하시길~


  • Profile
    권순일 2006.11.21 02:00
    감사합니다... 좋은 하루되세요....^^