Access中字符串存储的日期无法使用DateValue/CDate函数处理求助
解决Access中无分隔符日期字符串的转换问题
我之前也踩过这个坑,这种YYYYMMDDHHMM格式的无分隔符日期字符串,确实会让Access自带的DateValue、CDate这类常规转换函数直接“罢工”——毕竟它们只认带结构化分隔符的日期格式(比如YYYY-MM-DD或MM/DD/YYYY)。针对你提到的添加分隔符时出现匹配错误的问题,下面给你几个经过验证的解决方案:
方案1:查询中直接用字符串拆分拼接(快速解决)
如果只是单次查询需要转换,直接用字符串截取函数拼接成Access能识别的日期时间格式,再用CDate转换即可。假设你的字符串字段名为RawDateStr,表达式如下:
CDate(Left([RawDateStr],4) & "-" & Mid([RawDateStr],5,2) & "-" & Mid([RawDateStr],7,2) & " " & Mid([RawDateStr],9,2) & ":" & Right([RawDateStr],2))
各部分解释:
Left([RawDateStr],4):提取前4位作为年份(比如示例中的2017)Mid([RawDateStr],5,2):从第5位开始取2位作为月份(04)Mid([RawDateStr],7,2):从第7位开始取2位作为日期(10)Mid([RawDateStr],9,2):从第9位开始取2位作为小时(07)Right([RawDateStr],2):提取最后2位作为分钟(05)- 用
-、空格、:拼接后,得到标准格式2017-04-10 07:05,CDate就能正常识别转换了
如果你的数据里存在格式不规范的记录(比如长度不是12位、包含非数字字符),可以加个判断避免报错:
IIF(IsNumeric([RawDateStr]) And Len([RawDateStr])=12, CDate(Left([RawDateStr],4) & "-" & Mid([RawDateStr],5,2) & "-" & Mid([RawDateStr],7,2) & " " & Mid([RawDateStr],9,2) & ":" & Right([RawDateStr],2)), Null)
方案2:自定义VBA函数(复用性强)
如果需要在多个查询、窗体或报表中重复转换,写个自定义VBA函数更高效:
- 打开Access的VBA编辑器(按
Alt+F11) - 插入一个新模块,粘贴以下代码:
Function ConvertToDateTime(rawStr As String) As Variant ' 先验证字符串格式是否符合YYYYMMDDHHMM(12位纯数字) If Len(rawStr) <> 12 Or Not IsNumeric(rawStr) Then ConvertToDateTime = Null ' 格式错误返回空值 Exit Function End If Dim yyyy As String, mm As String, dd As String Dim hh As String, mi As String yyyy = Left(rawStr, 4) mm = Mid(rawStr, 5, 2) dd = Mid(rawStr, 7, 2) hh = Mid(rawStr, 9, 2) mi = Right(rawStr, 2) ' 拼接成合法格式并转换,用/适配不同区域设置 ConvertToDateTime = CDate(yyyy & "/" & mm & "/" & dd & " " & hh & ":" & mi) End Function
之后你就可以在查询中直接调用:
ConvertToDateTime([RawDateStr])
或者在窗体控件的数据源中使用,非常灵活。
方案3:批量更新为日期字段(一劳永逸)
如果想永久把字符串字段转换成日期/时间类型,建议先备份表,再运行更新查询:
UPDATE YourTableName SET NewDateTimeField = CDate(Left([RawDateStr],4) & "-" & Mid([RawDateStr],5,2) & "-" & Mid([RawDateStr],7,2) & " " & Mid([RawDateStr],9,2) & ":" & Right([RawDateStr],2)) WHERE IsNumeric([RawDateStr]) And Len([RawDateStr])=12;
注意事项:
- 提前在表中新增一个
日期/时间类型的字段(比如NewDateTimeField) - 一定要先备份表,避免转换过程中数据丢失
- 如果有不符合格式的记录,WHERE子句会跳过它们,避免报错
内容的提问来源于stack exchange,提问作者ellimach
相关产品推荐
相关产品推荐

