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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 01:31:01