【问题标题】:Call Access query and add column for each record returned调用访问查询并为返回的每条记录添加列
【发布时间】:2013-06-27 22:33:48
【问题描述】:

我有一个看起来像这样的查询...

SELECT tbl1.ProjectID, tbl1.EntryDate AS StartDate, tbl2.EntryDate AS EndDate
FROM checklist_entries tbl1
INNER JOIN checklist_entries tbl2
ON tbl1.ProjectID = tbl2.ProjectID
WHERE tbl1.ChecklistDay = (SELECT ChecklistDayMin FROM milestone_def WHERE MilestoneDefID = [@milestoneID])
AND tbl2.ChecklistDay = (SELECT ChecklistDayMax FROM milestone_def WHERE MileStoneDefID = [@milestoneID])

如您所见,这是一个自联接表,它返回一个 ProjectID (FK)、一个 StartDate 和 EndDate,它们都是表中的 EntryDate 列。为了返回记录,我需要传入一个整数值 [@milestoneID],它允许子查询返回 WHERE 子句所需的最小值和最大值。

由于此查询返回两个日期,我想了解如何在此查询的基础上构建并添加另一个列,该列返回的整数值 TotalDays(TotalDays 是工作日,周一至周五)由返回的结果确定开始日期和结束日期。

我可以找到一个查询来返回天数,但基本上我想在 ACCESS 中创建一个查询,允许我调用此查询(并传入 [@MilestoneID] 参数)并为返回的每条记录添加TotalDays 计数末尾的列。

【问题讨论】:

    标签: sql ms-access


    【解决方案1】:

    类似于我的回答here,您可以创建一个 VBA 函数来包含使用的工作日数

    SELECT 
        ... ,
        CountWeekdays(tbl1.EntryDate, tbl2.EntryDate) AS TotalWeekdays 
    FROM ...
    

    只需在 Access 中创建一个新的Module 并将以下代码粘贴到其中:

    Public Function CountWeekdays(Date1 As Date, Date2 As Date) As Long
    Dim StartDate As Date, EndDate As Date, _
            Weekdays As Long, i As Long
    If Date1 > Date2 Then
        StartDate = Date2
        EndDate = Date1
    Else
        StartDate = Date1
        EndDate = Date2
    End If
    Weekdays = 0
    For i = 0 To DateDiff("d", StartDate, EndDate)
        Select Case Weekday(DateAdd("d", i, StartDate))
            Case 1, 7
                ' weekend - do nothing
            Case Else
                Weekdays = Weekdays + 1
        End Select
    Next
    CountWeekdays = Weekdays
    End Function
    

    【讨论】:

    • 感谢您的回复,但我将如何仅使用 SQL 来执行此操作?这个 Access 数据库是临时的,很快就会迁移到 MySQL,我希望将工作保留在后端而不是应用程序代码中。
    • @user1066133 不要将 VBA 函数视为“应用程序代码”,将其视为相当于 SQL Server“标量值函数”或 MySQL“函数”的 Access。单独在 Access SQL 中完成同样的事情会很丑陋(它会涉及一个数字表和几个级别的派生表),而且它几乎肯定不会直接转换为 MySQL。即使是 MySQL 中的“plain-SQL”解决方案也有点粗糙,如图here
    • 是的,你是对的。我遇到的唯一问题是,当我现在运行查询时,它会出现“表达式中的未定义函数'CountWeekDays'”错误。该模块的名称明显相同,并且完全如图所示复制/粘贴。
    • @user1066133 验证函数是否在“常规”VBA 模块中,而不是“类模块”或与表单关联的模块(也是类模块)。
    • 单击“创建”选项卡,在最右侧,我单击“类模块”顶部的“模块”并粘贴代码并将其命名为“CountWeekDays”。很确定这是一个标准模块。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 2010-11-02
    • 2014-11-19
    • 1970-01-01
    • 2012-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多