我需要将我的数据表连接到服务器日历文件(已设置财务日期,期间等)。我没有得到任何结果,并认为这是因为我的表有日期/时间,如“11/23/2009 11:30:34 AM”,日历文件只有日期/时间,如“11/23/2009”,所以字段不一样。
当前的SQL读起来像: 来自tbl_data 内部加入tbl_calendar on tbl_data.TRXdate = tbl_calendar.TRXdate
任何想法?
答案 0 :(得分: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运算符的原因是许多数据库引擎将第二个参数视为包含,因此它将为您提供两天而不仅仅是一天。
更多投机性建议:
ADO允许在记录集上创建虚拟索引,因此根据您在此处尝试执行的操作,您可以通过在计算字段Int(tbl_calendar.TRXdate)上创建虚拟索引来加快速度。 。我从来没有这样做过,只知道这是可能的。
某些数据库引擎允许在视图上创建虚拟索引。在SQL Server中,这称为索引视图,它允许您创建一个索引为Int(tbl_calendar.TRXdate)表达式的视图。
服务器端的临时表也可能是一种解决方案,但索引视图的工作方式可以避免对此的需求,因为它将索引视图保存为表。
取决于其他数据库,可能会也可能不会使用索引。它们将在异构连接中使用的效率取决于所涉及的数据库引擎,以及您用于执行SQL SELECT的数据库。例如,如果服务器端是SQL Server,那么通过将Jet / ACE数据文件作为链接服务器从SQL Server运行,可能会获得更好的性能。我的假设是对这种情况进行了优化,这可能会使得从SQL Server中获得的效率比从Jet中更高效,但是你必须进行测试才能确定。
另一个选项是填充Access数据库中的临时表,该临时表具有两列,即服务器端表中的PK和根据服务器数据计算的Int(tbl_calendar.TRXdate)值。如果您将其编入索引,那么在选择Jet / ACE数据时,您将获得相当不错的性能。但是如果你需要返回服务器端数据,你可能不会得到好的结果,但它可能比上面的任何替代方案更好。
答案 1 :(得分: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)
答案 2 :(得分:0)
另一种可能性:
FROM tbl_data
INNER JOIN tbl_calendar
ON tbl_calendar.TRXdate = CDate(Format(tbl_data.TRXdate,"yyyy/mm/dd"))
除了SQL视图外,无法在查询设计窗口中对其进行编辑。 日历位于等号的左侧,以利用索引。