2009-12-16 26 views
2

我需要将我的数据表加入到服务器日历文件(已设置财务日期,期间等)。我没有得到任何结果,并且相信这是因为我的表具有像“11/23/2009 11:30:34 AM”这样的日期/时间,而日历文件只有像“11/23/2009”这样的日期/时间,所以这些字段不相同。表在日期时间字段上的Access 2003中加入

当前的SQL读起来像: 从tbl_data 内加入tbl_calendar上tbl_data.TRXdate = tbl_calendar.TRXdate

什么想法?

+0

从什么环境运行SQL?从Access内或从查询环境的其他编程? – 2009-12-18 02:04:21

回答

0

另一种可能性:

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

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

1

考虑使用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) 
+0

+1 - 我认为这是最好的方法。 – 2009-12-18 05:21:57

2

在连接中使用函数不会使用索引。你可以这样做,而不是(假设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数据时您会获得相当不错的性能。但是,如果你需要返回服务器端数据,你可能不会得到好的结果,但它可能比上面的任何替代方案都好。

相关问题