2013-06-27 48 views
0

我有一個查詢,看起來像這樣...呼叫接入查詢和各記錄添加列返回

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]) 

正如你可以看到,這是一個自連接表返回我一個專案編號(FK),StartDate和EndDate,它們都是表中的EntryDate列。爲了讓記錄返回,我需要傳遞一個整數值[@milestoneID],它允許子查詢返回WHERE子句所需的最小值和最大值。

由於此查詢返回兩個日期,我想了解如何構建此查詢並添加另一列,該列使用TotalDays的整數值(TotalDays爲營業日,週一至週五)返回StartDate和EndDate。

我可以找到一個查詢來返回天數,但基本上我想在ACCESS中創建一個查詢,該查詢允許我調用此查詢(並傳入[@MilestoneID]參數)並返回每個記錄,將一列添加到TotalDays計數的末尾。

回答

2

到我的回答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 
+0

我很感謝您的迴應,但我如何僅使用SQL來執行此操作?這個Access數據庫是臨時的,很快就會遷移到MySQL,我希望將這些工作保留在後端而不是應用程序代碼中。 –

+0

@ user1066133不要以爲VBA功能爲「應用代碼」的,認爲它是訪問等同於SQL Server的「標量值函數」或MySQL的「功能」。單單在Access中完成同樣的事情會很醜陋(它會涉及一個數字表和幾個級別的派生表),它幾乎肯定不會直接轉換成MySQL。即使MySQL中的「純SQL」解決方案也有點粗糙,如[此處]所示(http://stackoverflow.com/a/12925535/2144390)。 –

+0

是的,你是對的。我遇到的唯一問題是,當我現在運行查詢時,表達式中的「未定義函數CountWeekDays」出現錯誤。該模塊明確命名相同,並完全按照所示進行復制/粘貼。 –