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

如何在MS Access(VB环境)中将特定格式字符串转为日期并计算时间差?

解决MS Access中时间戳字符串转日期的问题

嘿,我懂你的困扰——那种看着像日期时间但格式不标准的字符串,确实会让CDate摸不着头脑。你的CustNum是yyyy-mm-dd-hhmmss格式,直接替换连字符后得到的无分隔串,Access根本不认,得换个思路把它拆成系统能识别的日期时间结构。

给你两个靠谱的方案,直接在查询生成器里就能用:

方法1:重组为标准日期时间格式

把原字符串拆成日期和时间部分,拼接成yyyy-mm-dd hh:mm:ss这种CDate能识别的格式:

DaysPassed: CDate(Left([CustNum], 10) & " " & Mid([CustNum], 12, 2) & ":" & Mid([CustNum], 14, 2) & ":" & Mid([CustNum], 16, 2)) - Now()

公式拆解:

  • Left([CustNum], 10):提取前10位,拿到日期部分2018-05-14
  • Mid([CustNum], 12, 2):从第12位取2位,得到小时15;Mid([CustNum],14,2)取分钟45,Mid([CustNum],16,2)取秒40
  • 用空格和冒号拼接后,得到标准格式2018-05-14 15:45:40,CDate就能正常转换了

方法2:用DateSerial+TimeSerial直接构造日期时间

这个方法更稳妥,直接通过年、月、日、时等参数构建日期时间,不容易出错:

DaysPassed: DateSerial(Left([CustNum],4), Mid([CustNum],6,2), Mid([CustNum],9,2)) + TimeSerial(Mid([CustNum],12,2), Mid([CustNum],14,2), Mid([CustNum],16,2)) - Now()

逻辑说明:

  • DateSerial(年, 月, 日):用Left取4位年份,Mid分别取2位月份和日期,构造出纯日期值
  • TimeSerial(时, 分, 秒):拆分时间部分,构造出纯时间值
  • 两者相加得到完整的日期时间,再减去Now()就能算出流逝的天数(小数部分对应时分秒)

小补充:

因为Now()晚于交易时间,结果会是负数,如果你想要正数的流逝天数,可以套个Abs()函数:

DaysPassed: Abs(DateSerial(Left([CustNum],4), Mid([CustNum],6,2), Mid([CustNum],9,2)) + TimeSerial(Mid([CustNum],12,2), Mid([CustNum],14,2), Mid([CustNum],16,2)) - Now())

记得要保证CustNum的格式是严格的yyyy-mm-dd-hhmmss,每部分位数固定,不然Mid/Left函数会出错哦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:04:21