MS Access中使用变量计算减去工作日结果异常,求原因及解决方法
MS Access日期减法错误分析与解决
问题描述
在MS Access中尝试从指定日期减去指定工作日数,原代码可正常计算但未排除周末:
JS = CstmDD - LdTm
修改为以下代码后出现错误:
JS = Weekday(CstmDD) - LdTm
当客户到期日CstmDD为2022年9月30日、提前期LdTm为8天时,计算结果JS为1899年12月28日,预期结果应为2022年9月27日。
完整代码如下:
Dim LdTm As Long Dim CstmDD As Date Dim strSQL As String Dim strSQL2 As String Dim JS As Date strSQL = "SELECT Sum(tblRouting.OpleadTm) AS SumOfOpleadTm, tblRouting.[Job Number] " & vbCrLf & _ "FROM tblRouting " & vbCrLf & _ "GROUP BY tblRouting.[Job Number] " & vbCrLf & _ "HAVING (tblRouting.[Job Number])= " & EntJobNum LdTm = CurrentProject.Connection.Execute(strSQL).Fields("SumOfOpleadTm") strSQL2 = "SELECT tblManufactured.[Job Number], tblManufactured.[Customer Due Date] " & vbCrLf & _ "FROM tblManufactured " & vbCrLf & _ "WHERE (tblManufactured.[Job Number])=" & EntJobNum CstmDD = CurrentProject.Connection.Execute(strSQL2).Fields("Customer Due Date") JS = Weekday(CstmDD) - LdTm ' JS = CstmDD - LdTm MsgBox (LdTm) & vbNewLine & (CstmDD) & vbNewLine & (JS)
错误原因
Weekday()函数的作用是返回代表星期几的数字(默认规则:1=周日,2=周一,…,7=周六),而非日期值。
以你的场景为例:2022年9月30日是周五,Weekday(CstmDD)返回6。用6减去8得到-2,在Access的日期体系中,1899年12月30日对应日期值0,因此-2对应的就是1899年12月28日,这就是错误结果的来源。
你混淆了Weekday()的返回值类型,错误地用它替代原日期变量进行减法运算,完全偏离了“排除周末计算工作日”的需求。
解决方法
要实现排除周末的工作日减法,需要通过循环逐天校验,或自定义工作日计算函数。以下是简单可靠的自定义函数实现:
Function SubtractWorkdays(startDate As Date, daysToSubtract As Long) As Date Dim currentDate As Date Dim subtractedCount As Long currentDate = startDate subtractedCount = 0 Do While subtractedCount < daysToSubtract currentDate = currentDate - 1 ' 跳过周六和周日 If Weekday(currentDate) <> vbSunday And Weekday(currentDate) <> vbSaturday Then subtractedCount = subtractedCount + 1 End If Loop SubtractWorkdays = currentDate End Function
将原代码中的JS = Weekday(CstmDD) - LdTm替换为:
JS = SubtractWorkdays(CstmDD, LdTm)
这样就能正确计算出排除周末后的目标日期。
内容的提问来源于stack exchange,提问作者sambob_628
相关产品推荐
相关产品推荐

