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

如何在RecordSet中存储dd/mm/yyyy格式的日期数据

问题根因

你定义的Date字段类型为adDate,这是ADO原生的二进制日期存储类型,底层和Delphi的TDateTime一致,用双精度浮点数存储时间戳,本身不携带任何字符串格式信息。你看到的d/m/yyyy格式只是调试器、或者默认读取时按照系统区域设置输出的展示格式,并不是字段实际存储的内容。
你当前的代码把FormatDateTime返回的字符串赋值给日期类型字段,会触发隐式类型转换,字符串格式会被直接丢弃,自然无法保留前置零。

解决方案

根据你的实际需求选择以下两种方案即可:

  • 方案1:需要固定存储dd/mm/yyyy格式的字符串
    将字段类型改为字符串类型即可,修改字段定义代码:
    rs: _Recordset;
    dt: TDatetime;
    
    Rs := CoRecordset.Create;
    // 把adDate改为adVarChar,长度设为10足够存dd/mm/yyyy格式的字符串
    Rs.Fields.Append('Date', adVarChar, 10, adfldupdatable, Unassigned);    
    Rs.Fields.Item['Date'].Value := FormatDateTime('dd/mm/yyyy', dt);
    
    调整后字段会直接存储你格式化好的字符串,前置零不会丢失。
  • 方案2:不需要存储格式,仅读取展示时需要dd/mm/yyyy格式
    保留adDate类型的字段优势(支持日期排序、计算、过滤),赋值时直接传TDateTime变量,不需要提前转字符串:
    rs: _Recordset;
    dt: TDatetime;
    
    Rs := CoRecordset.Create;
    Rs.Fields.Append('Date', adDate, 4, adfldupdatable, Unassigned);    
    // 直接赋值日期变量,不要转字符串
    Rs.Fields.Item['Date'].Value := dt;
    
    后续需要读取展示时,再用FormatDateTime('dd/mm/yyyy', Rs.Fields.Item['Date'].Value)格式化输出即可,也能得到你要的带前置零的格式。

内容的提问来源于stack exchange,提问作者jmontegrosso

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 23:24:03