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
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;
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);
dDta := TJ3Utils.DBXDateToDateTime(DBXRdr.Value[0].GetDate);
Espero que tenham gostado. Em breve tem mais. =) Abraços,
Nelson Lima
Olá Nelson, tudo bem?
ResponderExcluirVi 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