从 Access 中的日期时间字段中选择时间范围

Posted

技术标签:

【中文标题】从 Access 中的日期时间字段中选择时间范围【英文标题】:Selecting Time ranges from Date Time fields in Access 【发布时间】:2009-09-02 16:17:33 【问题描述】:

我有一个表格,其中包含报告及其创建日期/时间。我想创建一个图表来统计在两个时间段之间的十分钟间隔内创建的报告数量:上午 8:00 到上午 9:00 和下午 1:00 到下午 2:00。

这是我要运行的查询示例:

SELECT
s.StudyStartDateTime AS "8:00 - 8:10",
s.StudyStartDateTime AS "8:10 - 8:20",
s.StudyStartDateTime AS "8:20 - 8:30",
s.StudyStartDateTime AS "8:30 - 8:40",
s.StudyStartDateTime AS "8:40 - 8:50",
s.StudyStartDateTime AS "8:50 - 9:00",
s.StudyStartDateTime AS "1:00 - 1:10",
s.StudyStartDateTime AS "1:10 - 1:20",
s.StudyStartDateTime AS "1:20 - 1:30",
s.StudyStartDateTime AS "1:30 - 1:40",
s.StudyStartDateTime AS "1:40 - 1:50",
s.StudyStartDateTime AS "1:50 - 2:00"
FROM
    dbo_Study_ViewX211_Rpt AS s
WHERE FORMAT("8:00 - 8:10", 'hh:mm:ss') BETWEEN "08:00:00" AND "08:09:59"
AND FORMAT("8:10 - 8:20", 'hh:mm:ss') BETWEEN "08:10:00" AND "08:19:59"
AND FORMAT("8:20 - 8:30", 'hh:mm:ss') BETWEEN "08:20:00" AND "08:29:59"
AND FORMAT("8:30 - 8:40", 'hh:mm:ss') BETWEEN "08:30:00" AND "08:39:59"
AND FORMAT("8:40 - 8:50", 'hh:mm:ss') BETWEEN "08:40:00" AND "08:49:59"
AND FORMAT("8:50 - 9:00", 'hh:mm:ss') BETWEEN "08:50:00" AND "08:59:59"
AND FORMAT("1:00 - 1:10", 'hh:mm:ss') BETWEEN "01:00:00" AND "01:09:59"
AND FORMAT("1:10 - 1:20", 'hh:mm:ss') BETWEEN "01:10:00" AND "01:19:59"
AND FORMAT("1:20 - 1:30", 'hh:mm:ss') BETWEEN "01:20:00" AND "01:29:59"
AND FORMAT("1:30 - 1:40", 'hh:mm:ss') BETWEEN "01:30:00" AND "01:39:59"
AND FORMAT("1:40 - 1:50", 'hh:mm:ss') BETWEEN "01:40:00" AND "01:49:59"
AND FORMAT("1:50 - 2:00", 'hh:mm:ss') BETWEEN "01:50:00" AND "01:59:59"

不幸的是,Access 似乎无法判断我要在 FORMAT 函数中格式化的字段是指查询中的同名字段。在上述情况下,我认为这是因为 Access 将其视为字符串文字。但是,这也不起作用:

SELECT
    s.StudyStartDateTime AS first
FROM
    dbo_Study_ViewX211_Rpt AS s
WHERE FORMAT(first, 'hh:mm:ss') BETWEEN "08:00:00" AND "08:09:59"

Access 提示我输入“first”的值。

我觉得我一开始就走错了路。谁能指出我正确的方向?

更多信息:我通过 ODBC 使用 Jet 引擎,但数据实际上存储在 SQL Server 2005 中,所以如果有必要我想我可以编写一个传递查询。但是,理想情况下,我希望它可以在 Access 中工作。

编辑:

要清楚,以下确实有效:

SELECT s.StudyStartDateTime AS first
FROM dbo_Study_ViewX211_Rpt AS s
WHERE FORMAT(StudyStartDateTime,'hh:mm:ss') Between "08:00:00" And "08:09:59";

但是,这不允许我在多个条件下多次选择同一个字段。

http://office.microsoft.com/en-us/access/HA012288391033.aspx#examples 的第一个示例表明,将字段的别名括在方括号中是引用记录源的正确方法,但以下仍会导致提示输入“first”的值:

SELECT s.StudyStartDateTime AS first
FROM dbo_Study_ViewX211_Rpt AS s
WHERE FORMAT([first],'hh:mm:ss') Between "08:00:00" And "08:09:59";

编辑二:

StudyStartDateTime 的几条记录的内容示例:

29/11/2007 8:06:00 AM
30/11/2007 8:09:01 AM
05/12/2007 8:06:51 AM
06/12/2007 8:07:21 AM

Access 将此字段视为“日期/时间”数据类型。

我的最终目标是绘制每个间隔的计数。我认为最简单的方法是简单地选择每个日期/时间作为不同的别名。例如:

8:00-8:10   8:10-8:20   8:20:8:30   ...
=======================================
8:01        
8:03
            8:15
                        8:23
                        8:28
                        8:28
...

【问题讨论】:

你研究过 PARTITION() 吗? 【参考方案1】:

您遇到的问题是因为 access 在同一查询中没有通过别名引用字段。这意味着您不能在 select 子句中分配别名并在 where 子句中使用它。

至于你问题的第一部分,你可以试试这样的

    SELECT 
        sum(iif(FORMAT(s.StudyStartDateTime,'hh:mm:ss') 
                BETWEEN "08:00:00" AND "08:09:59",1,0)) as "8:00 - 8:10",
        sum(iif(FORMAT(s.StudyStartDateTime,'hh:mm:ss') 
                BETWEEN "08:10:00" AND "08:19:59",1,0)) as "8:10 - 8:20",
        ...
    FROM dbo_Study_ViewX211_Rpt AS s

这将为您提供每 10 分钟的计数。

【讨论】:

完美。我知道我这样做是错误的。谢谢!

以上是关于从 Access 中的日期时间字段中选择时间范围的主要内容,如果未能解决你的问题,请参考以下文章

从 Access 导出到 Excel 时出现日期超出范围错误

MS Access 根据给定的日期范围选择查询字段

Linq to SQL 选择 DateTime 字段在任何日期范围列表中的行

从 Excel 中查询 Access 中的常规日期字段(错误 13)

MS Access:从日期时间值返回特定日期的查询

如何用C#从access中读取一个日期,然后判断这个日期是星期几?