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

