【问题标题】:table joins in Access 2003 on date-time field表在日期时间字段上加入 Access 2003
【发布时间】:2010-12-27 11:09:01
【问题描述】:

我需要将我的数据表加入服务器日历文件(已设置会计日期、期间等)。我没有得到任何结果,我认为这是因为我的表格有日期/时间,如“11/23/2009 11:30:34AM”,而日历文件只有日期/时间,如“11/23/2009”,所以字段不相同。

当前的 SQL 如下所示: 来自 tbl_data tbl_data.TRXdate = tbl_calendar.TRXdate 上的内连接 tbl_calendar

有什么想法吗?

【问题讨论】:

  • 您在什么环境中运行 SQL?从 Access 内部还是从其他一些查询环境编程?

标签: ms-access datetime join field


【解决方案1】:

在连接中使用函数不会使用索引。相反,您可以这样做(假设 tbl_data 是其数据中包含时间部分的表):

  SELECT *
  FROM tbl_data, tbl_calendar
  WHERE tbl_data.TRXdate >= tbl_calendar.TRXdate
    AND tbl_data.TRXdate < tbl_calendar.TRXdate + 1

这将使用两边的索引(尽管不一定适用于两个条件)。

不使用 BETWEEN/AND 运算符的原因是许多数据库引擎将第二个参数视为包含性参数,因此它会为您节省两天时间,而不仅仅是一天。

更多推测性建议:

  1. ADO 允许在记录集上创建虚拟索引,因此根据您在此处尝试执行的操作,您可以通过在计算字段 Int(tbl_calendar.TRXdate) 上创建虚拟索引来加快速度.我从来没有这样做过,只知道这是可能的。

  2. 一些数据库引擎允许在视图上创建虚拟索引。在 SQL Server 中,这称为索引视图,它允许您创建索引 Int(tbl_calendar.TRXdate) 表达式的视图。

  3. 服务器端的临时表也可能是一种解决方案,但索引视图的工作方式完全不需要这样做,因为它将索引视图保存为表。

  4. 根据其他数据库,可能会或可能不会使用索引。它们在异构连接中的使用效率将取决于所涉及的数据库引擎,以及您使用哪个引擎来执行 SQL SELECT。例如,如果服务器端是 SQL Server,那么通过将 Jet/ACE 数据文件作为链接服务器从 SQL Server 运行它可能会获得更好的性能。我的假设是,对于这种情况,有一些优化可能会使其在 SQL Server 中比在 Jet 中更有效,但您必须进行测试才能确定。

  5. 另一个选项是在 Access 数据库中填充一个临时表,该表具有两列,即来自服务器端表的 PK 和根据服务器数据计算的 Int(tbl_calendar.TRXdate) 值。如果您对它进行索引,您将在选择 Jet/ACE 数据时获得相当不错的性能。但是,如果您需要返回服务器端数据,您可能不会得到那么好的结果,但它可能比上述任何替代方案都要好。

【讨论】:

    【解决方案2】:

    考虑使用 DateValue 函数从您的日期/时间值中仅提取“日期部分”:

    ? DateValue(#11/23/2009 11:30:34AM#)
    11/23/2009
    

    但是,DateValue 实际上返回相关日期午夜的日期/时间值:

    ? Format(DateValue(#11/23/2009 11:30:34AM#), "mm/dd/yyyy hh:nn:ss")
    11/23/2009 00:00:00
    

    所以看看这样的连接表达式是否能得到你想要的:

    FROM tbl_data
    INNER JOIN tbl_calendar
    ON tbl_calendar.TRXdate = DateValue(tbl_data.TRXdate)
    

    【讨论】:

      【解决方案3】:

      另一种可能性:

      FROM tbl_data
      INNER JOIN tbl_calendar
      ON tbl_calendar.TRXdate = CDate(Format(tbl_data.TRXdate,"yyyy/mm/dd"))
      

      这不能在查询设计窗口中编辑,除非在 SQL 视图中。 日历位于等号的左侧以利用索引。

      【讨论】:

        猜你喜欢
        • 2013-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-30
        相关资源
        最近更新 更多