quarta-feira, 1 de agosto de 2012

TDBXDate To TDateTime


TDBXDate to TDateTime

Olá , se você está trabalhando com datas utilizando o TDBXDate e atribuindo diretamente no seu objeto que é tem uma propreidade do tipo TDateTime ou mesmo TDate, deve ter notado a que a data fica “maluca”.
procedure TFrmPrincipal.Button1Click(Sender: TObject);
var
  DBXCmd: TDBXCommand;
  DBXRdr: TDBXReader;
  dDta: TDateTime;
Begin
  DBXCmd := DM.DBXCon.DBXConnection.CreateCommand;
  try
    DBXCmd.Text := 'SELECT CAST(''NOW'' AS DATE) AS DATA' +
                         ' FROM RDB$DATABASE';
    DBXCmd.Prepare;
    DBXRdr := DBXCmd.ExecuteQuery;
    if DBXRdr.Next then
      dDta := DBXRdr.Value[0].GetDate;

    DBXCmd.Close;
    DBXRdr.Free;
  finally
    DBXCmd.Free;
  end;

  ShowMessage(FormatDateTime('dd/mm/yyyy', dDta));
end;

Esse exemplo clássico vai nos trazer algo assim:  1/08/3911 quando na realidade a data correta seria: 1/08/2012

Pois bem, para resolver esse problema criei uma função chamada de:
DBXDateToDateTime(_Data: TDBXDate): TDateTime;
Abaixo seque o código completo da minha UtilsClass que por sinal faz parte do meu novo FrameWork. Chamei minha classe de TJ3Utils e criei uma class function =) Segue:
{ TJ3Utils }
class function TJ3Utils.DBXDateToDateTime(_Data: TDBXDate): TDateTime;
var
  AuxData: TTimeStamp;
begin
  AuxData.Time := 0;
  AuxData.Date := _Data;
  Result := TimeStampToDateTime(AuxData);
end;

Então nosso atualizado ficará assim:
if DBXRdr.Next then
  dDta := TJ3Utils.DBXDateToDateTime(DBXRdr.Value[0].GetDate);


Espero que tenham gostado. Em breve tem mais.  =) Abraços,

 Nelson Lima

Um comentário:

  1. Olá Nelson, tudo bem?
    Vi seu post sobre a conversão de TDBXDate para TDateTime, vou precisar desta rotina, mas preciso do contrário, como converto TDateTime para TDBXDate?
    Preciso passar no DBXCommand.Parameters[5].Value.SetDate(TDateTime);

    Agradeço a atenção

    ResponderExcluir