2

У меня есть таблица со временем в поле даты и времени на сервере MSSQL2k8R2. Я связал таблицу в Access 2007. Таблица была перенесена с помощью помощника по миграции из Microsoft.Фильтр доступа во времени

т.е. Managemantstudio даст на SELECT TOP 3 [AbZeit], [AbBrP] FROM [dbo].[tSollFahrten] результатом

AbZeit     AbBrP 
1899-12-30 12:53:00.000 LOR 
1899-12-30 09:27:00.000 BAT 
1899-12-30 10:54:00.000 LOR 

Когда я собираюсь открыть набор записей ADO и установить фильтр, он работал отлично (но медленно).

Dim rs As New ADODB.Recordset 
rs.Open "Select * from tSollFahrten;", CurrentProject.Connection, adOpenKeyset, adLockOptimistic 
rs.Filter = "AbZeit=#12:53#" 
Debug.Print rs.RecordCount 
rs.Close 

В результате один набор записей. Но для открытия набора записей уже filterd не будет работать вообще. У меня нет результата.

Dim rs As New ADODB.Recordset 
rs.Open "Select * from tSollFahrten where AbZeit = #12:53#;", CurrentProject.Connection, adOpenKeyset, adLockOptimistic 
Debug.Print rs.RecordCount 
rs.Close 

Есть ли у кого-нибудь идеи, что там происходит?

+0

Будет ли он работать с '= # 1899-12-30 12: 53 #'? – Gustav

+0

№ По-прежнему нет результата. – Stefan

+0

Используя ADO 6.1, я попытался запустить аналогичный код здесь с Access 2013, и обе версии работали с ожидаемыми результатами (одинаковое количество записей). Так что-то еще происходит – Gustav

ответ

1

Проблема заключается в том, что время на сервере SQL хранится в виде datetime. Таким образом, поле в связанной таблице является datetime. Когда время хранится как time(7) на сервере SQL, поле в связанной таблице получит text. И тогда выбор будет работать с AbZeit='12:53', как и ожидалось.

+0

Интересно. Итак, ваше решение заключалось в изменении типа поля с 'datetime' на' time (7) '? И вы все еще запрашиваете с '# 12: 53 #'? –

+1

Да и нет. @SQLPolice теперь это должно быть '' 12: 53'', потому что теперь это текст для доступа. – Stefan

0

Поскольку это тип Date/Time, я бы предложил вам найти полную дату и время. Нечто подобное,

Dim rs As New ADODB.Recordset 

rs.Open "SELECT * FROM tSollFahrten " & _ 
     "WHERE AbZeit >= #1899-12-30 12:53:00# AND AbZeit <= #1899-12-30 12:54:00#;" , _ 
     CurrentProject.Connection, adOpenKeyset, adLockOptimistic 

Debug.Print rs.RecordCount 

rs.Close 
+0

Извините, но результата нет. – Stefan

1

Существует важное различие между этими двумя утверждениями:

rs.Open "Select * from tSollFahrten;", CurrentProject.Connection, adOpenKeyset, adLockOptimistic 
rs.Filter = "AbZeit=#12:53#" 

==> В этом случае вы получите первые данные с сервера SQL, с SQL SERVER СИНТАКСИСА, и затем вы фильтруете их LOCALLY с ACCESS SYNTAX.

rs.Open "Select * from tSollFahrten where AbZeit = #12:53#;", CurrentProject.Connection, adOpenKeyset, adLockOptimistic 

==> В этом случае, вы делаете все с SQL SERVER СИНТАКСИСА. Однако Hashtag ## специфичен для Access, и SQL Server этого не понимает.

EDIT: В SQL Server, вы можете запросить час и минуту, как это:

rs.Open "Select * from tSollFahrten where datepart(hh, AbZeit)=12 and datepart(mi, abZeit)=53", CurrentProject.Connection, adOpenKeyset, adLockOptimistic 
+0

Ах! Это хороший улов. Проголосуйте. :) – PaulFrancis

+0

Согласен, это было очень интересно. – Newd

+1

Вы забыли, что это связанная таблица. Тогда это Access SQL, а не T-SQL. И если это был T-SQL, 'где AbZeit = # 12: 53 #' будет выходить из строя. – Gustav

Смежные вопросы