使用FireDAC读取Access数据库日期时间字段时毫秒丢失问题
Delphi 12 FireDAC读取PostgreSQL日期时间丢失毫秒的解决方案
配置FireDAC连接参数
在PostgreSQL的连接定义(TDAConnectionDef)中开启ExtendedMetadata := True,该参数会让FireDAC获取字段的完整精度信息,避免截断毫秒。如果通过代码创建连接,可参考以下写法:var oParams: TDAPhysPgConnectionDefParams; begin oParams := TDAPhysPgConnectionDefParams(FDConnection1.Params); oParams.ExtendedMetadata := True; end;调整字段映射规则
强制FireDAC将PostgreSQL的timestamp/timestamptz类型映射到ftSQLTimeStamp类型,避免默认的ftDateTime转换导致精度丢失:FDConnection1.FormatOptions.OwnMapRules := True; FDConnection1.FormatOptions.MapRules.Add('timestamp', ftSQLTimeStamp); FDConnection1.FormatOptions.MapRules.Add('timestamptz', ftSQLTimeStamp);正确读取字段值
读取字段时使用AsSQLTimeStamp而非AsDateTime获取完整毫秒精度,再按需转换为显示格式:var SQLStamp: TSQLTimeStamp; sDateTime: string; begin SQLStamp := FDQuery1.FieldByName('your_datetime_field').AsSQLTimeStamp; sDateTime := FormatDateTime('dd-mm-yyyy hh:nn:ss:zzz', SQLTimeStampToDateTime(SQLStamp)); // 此时sDateTime会包含完整的毫秒部分 end;验证PostgreSQL字段类型
确保数据库中的字段为timestamp(或timestamp with time zone)类型,若需明确保留3位毫秒,可定义为timestamp(3)——PostgreSQL默认的timestamp为6位精度(微秒),完全满足需求。检查FireDAC版本
确保使用Delphi 12自带的最新FireDAC版本,旧版本可能存在日期时间精度处理的BUG,必要时通过Embarcadero更新工具获取补丁。
内容的提问来源于stack exchange,提问作者JacobHavkrog
相关产品推荐
相关产品推荐

