таблица присоединяется в Access 2003 в поле даты и времени - PullRequest
2 голосов
/ 17 декабря 2009

Мне нужно присоединить мою таблицу данных к файлу календаря сервера (с установленными финансовыми датами, периодами и т. Д.). Я не получаю никаких результатов и верю, что это потому, что в моей таблице есть дата / время, например "23.11.2009 11:30:34 AM", а в файле календаря есть только дата / время, например "23.11.2009" поля не идентичны.

текущий SQL читается как: Из tbl_data Внутреннее присоединение tbl_calendar на tbl_data.TRXdate = tbl_calendar.TRXdate

есть идеи?

Ответы [ 3 ]

2 голосов
/ 18 декабря 2009

Использование функций в объединениях не будет использовать индексы. Вместо этого вы можете сделать это (предполагая, что 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. В зависимости от другой базы данных индексы могут использоваться или не использоваться. Насколько эффективно они будут использоваться в гетерогенном соединении, будет зависеть от задействованных механизмов db и от того, какой из них вы используете для выполнения SQL SELECT. Если, например, на стороне сервера находится SQL Server, возможно, вы получите более высокую производительность, запустив его из SQL Server с файлом данных Jet / ACE в качестве связанного сервера. Мое предположение состоит в том, что есть оптимизация именно для такой ситуации, которая, вероятно, сделает ее более эффективной из SQL Server, чем из Jet, но вам нужно проверить, чтобы быть уверенным.

  5. другой вариант - заполнить временную таблицу в базе данных Access, которая имеет два столбца: PK из таблицы на стороне сервера и значение Int (tbl_calendar.TRXdate), рассчитанное на основе данных сервера. Если вы проиндексировали это, вы получите довольно хорошую производительность при выборе данных Jet / ACE. Но если вам нужно вернуть данные на стороне сервера, вы, вероятно, не получите столь же хорошие результаты, но это может быть лучше, чем любая из перечисленных выше альтернатив.

1 голос
/ 17 декабря 2009

Рассмотрите возможность использования функции 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 голосов
/ 17 декабря 2009

Другая возможность:

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

Это нельзя редактировать в окне конструктора запросов, кроме как в представлении SQL. Календарь находится слева от знака равенства, чтобы использовать индексы.

...