如何在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
相关产品推荐
相关产品推荐

