Sql 调用访问查询并为返回的每个记录添加列

Sql 调用访问查询并为返回的每个记录添加列,sql,ms-access,Sql,Ms Access,我有一个问题看起来很 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

我有一个问题看起来很

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为工作日,Mon-Fri),由返回的StartDate和EndDate确定

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

与我的回答类似,可以使用创建VBA函数来包含工作日数

SELECT 
    ... ,
    CountWeekdays(tbl1.EntryDate, tbl2.EntryDate) AS TotalWeekdays 
FROM ...
只需在Access中创建一个新的
模块
,并将以下代码粘贴到其中:

公共函数将工作日(Date1作为日期,Date2作为日期)计数为
Dim StartDate作为日期,EndDate作为日期_
平日一样长,我一样长
如果Date1>Date2,则
StartDate=Date2
EndDate=Date1
其他的
StartDate=Date1
EndDate=Date2
如果结束
工作日=0
对于i=0到日期差(“d”,开始日期,结束日期)
选择案例工作日(DateAdd(“d”,i,StartDate))
案例1、7
“周末-什么都不做
其他情况
工作日=工作日+1
结束选择
下一个
CountWeekdays=工作日
端函数

非常感谢您的回复,但我如何仅使用SQL来实现这一点?此Access数据库是临时数据库,不久将迁移到MySQL,我希望将工作保留在后端而不是应用程序代码中。@user1066133不要将VBA函数视为“应用程序代码”,将其视为相当于SQL Server“标量值函数”或MySQL“函数”的访问。仅在Access SQL中完成同样的任务是很难看的(它将涉及一个数字表和几个级别的派生表),而且几乎肯定不会直接转换到MySQL。如图所示,即使是MySQL中的“纯SQL”解决方案也有点粗糙。是的,你是对的。唯一的问题是,当我现在运行查询时,它会在表达式中出现“Undefined function'CountWeekDays”错误。该模块的名称明显相同,并且完全按照所示进行复制/粘贴。@user1066133验证该函数是否位于“常规”VBA模块中,而不是“类模块”或与表单关联的模块中(这也是一个类模块)。单击创建选项卡,在最右边,我单击了“类模块”顶部的“模块”,并粘贴在代码中,并给它命名为“CountWeekDays”。非常确定这是一个标准模块。