要使用Access查詢完成您的任務,您將需要創建一個名爲[Numbers]的表,其中包含數字1,2,3 ......的單個Number(Long Integer)列名爲[n]你期望與最合作的一年。我創建了我的如下
n
----
1
2
3
...
2499
2500
您還需要以下VBA函數粘貼到一個接入模塊
Public Function IsValidDayOfYear(YearValue As Long, DayValue As Long) As Boolean
Dim IsLeapYear As Boolean
If (YearValue Mod 400) = 0 Then
IsLeapYear = True
ElseIf (YearValue Mod 100) = 0 Then
IsLeapYear = False
ElseIf (YearValue Mod 4) = 0 Then
IsLeapYear = True
Else
IsLeapYear = False
End If
IsValidDayOfYear = (DayValue <= IIf(IsLeapYear, 366, 365))
End Function
讓我們假設你的源表被稱爲[DateRanges。我們將首先創建一個查詢,該查詢生成源表中每年的每一年的每一天。這裏的技巧是DateSerial()
「軋」 月界限,所以
DateSerial(2013,1,32)=#2013年2月1日#
和
DateSerial(2013,1,234 )=#2013年8月22日#
SELECT DateSerial(yr.n, 1, dy.n) AS [Date]
FROM Numbers yr, Numbers dy
WHERE
(
yr.n
BETWEEN (SELECT MIN(DatePart("yyyy", DateRanges.StartDate)) FROM DateRanges)
AND (SELECT MAX(DatePart("yyyy", DateRanges.EndDate)) FROM DateRanges)
)
AND (dy.n < 367) AND IsValidDayOfYear(yr.n, dy.n)
爲了您的樣本數據,該查詢返回所有的日子在2013年
讓我們保存了該查詢爲[ALLDAYS。現在,我們可以用它來單獨天提取每個日期範圍(省略起始日期,以便最終計數的問題和你的相符)
SELECT [Date] FROM AllDays
WHERE EXISTS
(
SELECT * FROM DateRanges
WHERE AllDays.[Date] BETWEEN DateAdd("d", 1, DateRanges.StartDate) AND DateRanges.EndDate
)
返回對應於每個範圍內各天,即,
Date
----------
2013-04-14
2013-04-15
2013-04-18
2013-04-19
2013-04-20
2013-04-21
2013-04-22
2013-04-23
2013-04-24
2013-04-29
2013-04-30
2013-05-01
2013-05-02
2013-05-03
2013-05-06
2013-05-07
2013-05-08
2013-05-09
2013-05-10
我們可以保存查詢作爲[RangeDays],然後用它按月份來計算我們的數...
SELECT DatePart("m", [Date]) AS [Month], COUNT(*) AS NumOfDays
FROM RangeDays
GROUP BY DatePart("m", [Date])
...返回
Month NumOfDays
----- ---------
4 11
5 8
莫非日期超過一個月的範圍界限:28/04/13至03/06/13? – HansUp
是的,這是一個非常真實的可能性 – rbhalla