Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access 使用日期范围跨越日期部分边界的日期部分()_Ms Access - Fatal编程技术网

Ms access 使用日期范围跨越日期部分边界的日期部分()

Ms access 使用日期范围跨越日期部分边界的日期部分(),ms-access,Ms Access,我目前正试图将一些数据表汇总成一份报告。表中的每条记录都包含一个日期范围,如下所示: StartDate EndDate -------------------- 13/04/13 15/04/13 17/04/13 24/04/13 28/04/13 03/05/13 05/05/13 10/05/13 假设日期范围表示休假天数,我希望能够计算每个月的总休假天数。我遇到了DatePart函数,它似乎与一种边缘情况不同:当日期范围跨越一个月边界时。由于Da

我目前正试图将一些数据表汇总成一份报告。表中的每条记录都包含一个日期范围,如下所示:

StartDate    EndDate
--------------------
13/04/13     15/04/13
17/04/13     24/04/13
28/04/13     03/05/13
05/05/13     10/05/13
假设日期范围表示休假天数,我希望能够计算每个月的总休假天数。我遇到了DatePart函数,它似乎与一种边缘情况不同:当日期范围跨越一个月边界时。由于DatePart函数返回一个给定日期的月份,我无法再使用它来确定edge案例记录的休假天数(在上面的示例中,它是记录3),因为它适用于两个单独的月份

理想情况下,我希望我的最终表格如下所示:

 Month       #OfDays
--------------------
   4           11               (1st record - 2, 2nd record - 7, 3rd record - 2)
   5           8                (3rd record - 3, 4th record - 5)
我考虑过一些混乱的选项,例如填充一个临时表,每个记录表示不同的一天,然后对此进行查询,但我不确定这与报告有何关联。现在我的报告记录源是(不正确的)查询,是否可以将记录源作为返回记录源的VBA函数

我想的另一件事是可能有一个初始查询,将任何边缘案例拆分为两个单独的记录,其中日期范围仅涵盖一个月,然后将其用于我的最终分组查询。这可能吗

我觉得这个问题可能有更简单的解决办法,但我看不出来


如果有人有任何想法,将不胜感激

要使用Access查询完成任务,您需要创建一个名为[Numbers]的表,其中有一个名为[n]的数字(长整数)列,其中包含数字1、2、3、。。。直到您期望与之合作的最高年份。我创建了我的如下

   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
对于示例数据,该查询将返回2013年的所有天数

让我们将该查询另存为[AllDays]。现在,我们可以使用它来提取每个日期范围的各个日期(省略StartDate,以便最终计数与您在问题中的计数相匹配)

返回每个范围对应的各个天数,即

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

日期范围是否可以跨越一个月以上的界限:2013年4月28日至2013年6月3日?是的,这是一个非常有可能的进步努力,GT+1@HansUp谢谢我敢肯定,我至少从你那里学会了一个这样的把戏。戈德,再次拯救我!谢谢你的详细回答。如果两个日期范围交叉,我认为这不会显示重复的日期,对吗?例如,如果我有2013年1月1日-2013年5月1日和2013年1月4日-2013年10月1日,那么在最终的[AllDays]查询中只会显示2013年1月1日-2013年10月1日?只是为了澄清一下,这很好,因为我的日期范围与“休假天数”类似,所以重复的日期无论如何都不算在内,我只是想确保我正确地解释了它,因为每天只在[AllDays]中出现一次,并且没有可能引入重复的联接条件,所以不会重复计算。因此,是的,你先前评论中的例子是正确的。
SELECT DatePart("m", [Date]) AS [Month], COUNT(*) AS NumOfDays
FROM RangeDays
GROUP BY DatePart("m", [Date])
Month  NumOfDays
-----  ---------
    4         11
    5          8