创建一个从日期范围开始计算一个月内天数的字段?

时间:2014-02-10 20:34:13

标签: sql database date ms-access count

 Similar to the following:

Count days within a month from date range

我想在MS-Access查询设计环境中找到一种方法来创建计算日期范围内月/年天数的字段。

以下是我希望数据的样子:

Row |  StartDate | EndDate |  #DaysJan2010 | #DaysFeb2010 |  #DaysMarch2010

001    01/02/2010 02/04/2012        29             28              31
002    01/02/2010 01/05/2010         4              0               0
003    04/02/2010 05/05/2010         0              0               0     
004    01/02/2010 02/04/2012        29             28              31
005    02/02/2012 02/03/2012         0              2               0

请记住,月份和年份都很重要,因为我需要能够区分2010年1月到2011年1月的特定日期范围内的天数,而不仅仅是天内的天数。一月份的给定日期范围。

如果在Access中使用SQL执行创建这些字段的系统方法,那将是我首选的方法。

但是,如果不可能(或非常困难)这样做,我想知道如何在表达式构建器中构建每个字段,这样我至少可以生成一个计数字段一次。

一如既往,非常感谢你的时间。

1 个答案:

答案 0 :(得分:2)

有些情况下日期操作可以通过“日期表”辅助。与“数字表”类似,“日期表”是一个表,其中包含给定范围内每个日期的一行,通常涵盖实际数据中可能遇到的整个日期范围。

对于名为[SampleData]

的表中的样本数据
Row  StartDate   EndDate   
---  ----------  ----------
001  2010-01-02  2012-02-04
002  2010-01-02  2010-01-05
003  2010-04-02  2010-05-05
004  2010-01-02  2012-02-04
005  2012-02-02  2012-02-03

和[DatesTable]只是

theDate
----------
2010-01-01
2010-01-02
2010-01-03
...
2012-12-30
2012-12-31

查询

SELECT
    sd.Row,
    dt.theDate,
    Year(dt.theDate) AS theYear,
    Month(dt.theDate) AS theMonth
FROM
    SampleData AS sd
    INNER JOIN
    DatesTable AS dt
        ON dt.theDate >= sd.StartDate
            AND dt.theDate <= sd.EndDate

为每个[SampleData]。[Row]值的间隔中的每个日期返回一行。 (对于此特定样本数据,总共1568行。)

对该

执行聚合
SELECT
    Row,
    theYear,
    theMonth,
    COUNT(*) AS NumberOfDays
FROM
    (
        SELECT
            sd.Row,
            dt.theDate,
            Year(dt.theDate) AS theYear,
            Month(dt.theDate) AS theMonth
        FROM
            SampleData AS sd
            INNER JOIN
            DatesTable AS dt
                ON dt.theDate >= sd.StartDate
                    AND dt.theDate <= sd.EndDate
    ) AS allDates
GROUP BY
    Row,
    theYear,
    theMonth

给我们所有的计数

Row  theYear  theMonth  NumberOfDays
---  -------  --------  ------------
001     2010         1            30
001     2010         2            28
001     2010         3            31
001     2010         4            30
001     2010         5            31
001     2010         6            30
001     2010         7            31
001     2010         8            31
001     2010         9            30
001     2010        10            31
001     2010        11            30
001     2010        12            31
001     2011         1            31
001     2011         2            28
001     2011         3            31
001     2011         4            30
001     2011         5            31
001     2011         6            30
001     2011         7            31
001     2011         8            31
001     2011         9            30
001     2011        10            31
001     2011        11            30
001     2011        12            31
001     2012         1            31
001     2012         2             4
002     2010         1             4
003     2010         4            29
003     2010         5             5
004     2010         1            30
004     2010         2            28
004     2010         3            31
004     2010         4            30
004     2010         5            31
004     2010         6            30
004     2010         7            31
004     2010         8            31
004     2010         9            30
004     2010        10            31
004     2010        11            30
004     2010        12            31
004     2011         1            31
004     2011         2            28
004     2011         3            31
004     2011         4            30
004     2011         5            31
004     2011         6            30
004     2011         7            31
004     2011         8            31
004     2011         9            30
004     2011        10            31
004     2011        11            30
004     2011        12            31
004     2012         1            31
004     2012         2             4
005     2012         2             2

然后我们可以报告,或交叉表,或做任何其他有趣的事情。

旁注:

“日期表”非常有用的一种情况是我们必须处理法定假日。那是因为

  1. 有时法定假日的“休息日”不是实际的一天。如果“国际培根日”在星期天落下,那么我们可能会在星期一休息。

  2. 有些法定假日可能很难计算。例如,加拿大人的耶稣受难日(如果我没记错的话)是“春分之后第一个满月之后的第一个星期日之前的星期五”。

  3. 如果我们有“日期表”,那么我们可以添加[StatutoryHoliday] Yes/No字段来标记所有(观察到的)假期,然后使用... WHERE NOT StatutoryHoliday排除它们。