You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 22:08:13