프로그래밍/델파이

SQL의 DATETIME과 델파이 쿼리 결과와의 관계 정리

채윤아빠 2008. 1. 28. 17:03
728x90
반응형
SQL의 DATETIME과 델파이 쿼리 실행 결과와의 관계를 정리해 보았습니다.

다음과 같은 테스트 테이블을 생성한 이후에 테스트를 진행하였습니다.

CREATE TABLE DATE_TEST
(
 seq INT IDENTITY(1, 1) NOT NULL,
 date1 SMALLDATETIME NULL,
)

INSERT INTO DATE_TEST -- 첫 번째 데이터 입력
VALUES ( NULL )

위와 같은 테이블의 결과를 얻는 부분을 다음과 같이 작성하였습니다.

SELECT * FROM DATE_TEST

procedure TForm1.Button1Click(Sender: TObject);
begin
  ADOQuery.Open;
  try
    if (ADOQuery.Fields[1].IsNull) then
      Memo1.Lines.Add('Null')
//      Memo1.Lines.Add(FormatDateTime('yyyy-mm-dd', ADOQuery.Fields[1].AsDateTime))
//      Memo1.Lines.Add(FormatFloat('0.00', ADOQuery.Fields[1].AsFloat))
    else
      Memo1.Lines.Add(FormatDateTime('yyyy-mm-dd', ADOQuery.Fields[1].AsDateTime));
  finally
    ADOQuery.Close;
  end;
end;

제일 처음 입력한 레코드가 NULL에 대한 출력 결과입니다.

첫 번째 줄은 "Null"로 출력이 됩니다.
두 번째 줄처럼 AsDateTime로 변환하면 "1899-12-30 00:00:00"로 출력이 됩니다.
세 번째 AsFloat로 하면 "0.00"으로 출력됩니다.


다음은 날짜 데이터를 입력하는 경우입니다.

  ADOQuery1.SQL.Text := 'INSERT INTO NeoANT_G2B..DATE_TEST VALUES ( ? )';
  ADOQuery1.Prepared := true;
  ADOQuery1.Parameters.Items[0].Value := 0;
  ADOQuery1.ExecSQL;

위와 같이 입력을 하면 실제 DB에는 "1900-01-01 00:00:00"로 입력이 됩니다.


  ADOQuery1.Parameters.Items[0].Value := null;

위와 같이 입력을 하면 실제 DB에는 DB에 NULL로 입력됩니다.

  ADOQuery1.Parameters.Items[0].Value := '';

위와 같이 입력하면 입력형식이 일치하지 않는다는 오류가 발생합니다.

  ADOQuery1.Parameters.Items[0].Value := '1';

위와 같이 입력하면 실제 DB에는 '1900-01-02 00:00:00' 와 같이 입력됩니다. 1이 숫자형으로 변환되면서 하루가 계산되어 입력되는 것입니다.