Si bien Free Pascal tiene muchas funciones para el tratamiento de fecha y hora, a veces por la configuración regional hay que hacer conversiones.
Usando TFormatSettings:
aFormatSettings.LongDateFormat:='yyyy-mm-dd hh:nn:ss';
aFormatSettings.DateSeparator := '-';
aFormatSettings.TimeSeparator := ':';
Donde aFormatSettings es una variable del tipo TFormatSettings y luego utilizando la función FormatDateTime que devuelve un string:
function FormatDateTime(
const FormatStr: string;
DateTime: TDateTime;
Options: TFormatDateTimeOptions = []
):string;
function FormatDateTime(
const FormatStr: string;
DateTime: TDateTime;
const FormatSettings: TFormatSettings;
Options: TFormatDateTimeOptions = []
):string;
Por ejemplo en una sentencia SQL en WHERE:
sqlWhere:='WHERE regfecha BETWEEN '+QuotedStr(FormatDateTime('YYYY-MM-DD',edFechaDesde.Date))+
' AND '+QuotedStr(FormatDateTime('YYYY-MM-DD',edFechaHasta.Date))';
En este caso no fue necesario TFormatSettings y solo fue fecha, sin hora.
Con TZquery.FieldByName y utilizando componentes TDateTimePicker esto funciona:
ZQReg.FieldByName('regfechahora').AsDateTime:=dtpFecha.Date+dtpHora.Time;
En cuanto los campos del tipo TIME en SQLite; StrToTime('00:00:00') evita el valor nulo que muchas veces conviene evitar.
En SQLite la fecha debe ir entre comillas simples.
Y ante cualquier complicación siempre podemos hacer una función como la siguiente:
function FormatoFechaHoraSQLite(lafechahora: TDateTime): String;
var
d,m,a,h,mi,s,ms:Word;
dd,mm,hh,mmi,ss,mms:String;
lfecha, lhora:String;
begin
DecodeDate(lafechahora,a,m,d);
if d < 10 then dd:='0'+IntToStr(d) else dd:=IntToStr(d);
if m < 10 then mm:='0'+IntToStr(m) else mm:=IntToStr(m);
lfecha:=IntToStr(a)+'-'+mm+'-'+dd;
DecodeTime(lafechahora,h,mi,s,ms);
if h < 10 then hh:='0'+IntToStr(h) else hh:=IntToStr(h);
if mi < 10 then mmi:='0'+IntToStr(mi) else mmi:=IntToStr(mi);
if s < 10 then ss:='0'+IntToStr(s) else ss:=IntToStr(s);
if ms < 10 then mms:='00'+IntToStr(ms) else
if ms < 100 then mms:='0'+IntToStr(ms) else
mms:=IntToStr(ms);
lhora:=hh+':'+mmi+':'+ss+'.'+mms;
Result:=lfecha+' '+lhora;
end;
O más sencillo usando la función AddChar que se encuentra en la unidad strutils.
function FormatoFechaHoraSQLite2(lafechahora: TDateTime): String;
var
d,m,a,h,mi,s,ms:Word;
dd,mm,hh,mmi,ss,mms:String;
lfecha, lhora:String;
begin
DecodeDate(lafechahora,a,m,d);
dd:=AddChar('0',IntToStr(d),2);
mm:=AddChar('0',IntToStr(m),2);
lfecha:=IntToStr(a)+'-'+mm+'-'+dd;
DecodeTime(lafechahora,h,mi,s,ms);
hh:=AddChar('0',IntToStr(h),2);
mmi:=AddChar('0',IntToStr(mi),2);
ss:=AddChar('0',IntToStr(s),2);
mms:=AddChar('0',IntToStr(ms),3);
lhora:=hh+':'+mmi+':'+ss+'.'+mms;
Result:=lfecha+' '+lhora;
end;
DecodeDate y DecodeTime son procedimientos y utiliza variables del tipo Word que son enteros sin signo entre 0 y 65535. Le enviamos un TDateTime y las variables del tipo Word donde se escribirán el año, mes y día (en DecodeDate). No es necesario inicializar las variables, el procedimiento utiliza out:
procedure DecodeDate(
Date: TDateTime;
out Year: Word;
out Month: Word;
out Day: Word
);
No hay comentarios:
Publicar un comentario