Запрос доступа к таблицам в связанной базе данных SQL Server, не возвращающий данные для поиска значений времени и даты, как раз - PullRequest
1 голос
/ 17 ноября 2010

Вот запрос, который выполняется в SQL Server 2008:

SELECT "dbo"."tblMainData"."recID" 
FROM "dbo"."tblMainData" 
WHERE ("timeInMain" BETWEEN {t '08:00:00'} AND {t '17:00:00'} ) 

Этот запрос генерируется базой данных Microsoft Access 2007, которая имеет связанные таблицы в базе данных SQL Server 2008.

Вот запрос Access, который генерирует вышеуказанный запрос:

SELECT tblMainData.timeInMain
FROM tblMainData
WHERE (((tblMainData.timeInMain) Between #12/30/1899 8:0:0# And #12/30/1899 17:0:0#));

Во всяком случае, я знаю, что есть данные, которые соответствуют этому критерию. Почему я не вижу ожидаемых результатов?

Это первый раз, когда я увидел синтаксис {t '08:00:00'}, который, как я предполагаю, должен игнорировать часть даты в поле даты и времени. Я не смог найти никакой документации по нему.

Спасибо за любую помощь.

UPDATE

Просто запустил select {t '08:00:00'} в SSMS, который возвратил 2010-11-17 08:00:00.000. Это объясняет, почему я не получаю данные обратно. Но, как вы можете видеть, запрос Access явно указывает, какую дату использовать, и сгенерированный TSQL не включает ее. Что делать?

ОБНОВЛЕНИЕ 2

Я провел некоторые эксперименты. Access удаляет дату из сгенерированного TSQL только тогда, когда она 30.12.1899. По-видимому, это особая дата, которую Access использует, когда пользователь хранит только время в поле DateTime, а Access предполагает, что, если он включен в запрос, это не очень важно. Ничего себе.

Итак, я считаю, что мои варианты:

  1. Вызов хранимых процедур из Access. Я пока не знаю, как это сделать.
  2. Обновите данные в базе данных сервера sql, указав дату, которая не будет отбрасываться при создании TSQL.
  3. Попробуйте найти способ включить в сгенерированный TSQL явную дату 30.12.1899. IDEAL

Есть еще идеи?

1 Ответ

1 голос
/ 18 ноября 2010

Вы можете изменить условие where на следующее, которое удаляет дату в левой части сравнения

WHERE TimeValue(tblMainData.timeInMain) Between #12/30/1899 9:0:0# And #12/30/1899 17:0:0#

Если вы знаете, что все значения в базе данных будут включены30/12/1899, чем вы можете просто сделать

WHERE tblMainData.timeInMain Between #12/30/1899 9:0:0# And #12/30/1899 17:0:0#

Кроме того, если вы хотите сделать это в процедуре SQL Server, вы можете вырезать дату, используя следующее (это не так многомедленнее, чем если бы вы знали даты)

    WHERE 
         DATEADD( DAY , -1 *DATEDIFF(DAY, 0, timeInMain ) , timeInMain )
                    BETWEEN '09:00' and '17:00'

ОБНОВЛЕНИЕ

Вот как я это проверил

Я создал таблицу и заполнил ее, используяследующие в SQL Server

CREATE Test 
( 
    id int identity,
    DateTimeValue DateTime
)

--Values with COM Zero Date
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1899 8:00 AM')
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1899 9:00 AM')
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1899 10:00 AM')
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1899 11:00 AM')
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1899 12:00 PM')
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1899 1:00 PM')
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1899 2:00 PM')
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1899 3:00 PM')
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1899 4:00 PM')
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1899 5:00 PM')
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1899 6:00 PM')
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1899 7:00 PM')

--Values with SQL Zero Date
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1900 8:00 AM')
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1900 9:00 AM')
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1900 10:00 AM')
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1900 11:00 AM')
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1900 12:00 PM')
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1900 1:00 PM')
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1900 2:00 PM')
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1900 3:00 PM')
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1900 4:00 PM')
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1900 5:00 PM')
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1900 6:00 PM')
INSERT INTO Test (DateTimeValue) VALUES ('1/1/1900 7:00 PM')

--Abritrary Date After Zero Dates
INSERT INTO Test (DateTimeValue) VALUES ('1/1/2010 8:00 AM')
INSERT INTO Test (DateTimeValue) VALUES ('1/1/2010 9:00 AM')
INSERT INTO Test (DateTimeValue) VALUES ('1/1/2010 10:00 AM')
INSERT INTO Test (DateTimeValue) VALUES ('1/1/2010 11:00 AM')
INSERT INTO Test (DateTimeValue) VALUES ('1/1/2010 12:00 PM')
INSERT INTO Test (DateTimeValue) VALUES ('1/1/2010 1:00 PM')
INSERT INTO Test (DateTimeValue) VALUES ('1/1/2010 2:00 PM')
INSERT INTO Test (DateTimeValue) VALUES ('1/1/2010 3:00 PM')
INSERT INTO Test (DateTimeValue) VALUES ('1/1/2010 4:00 PM')
INSERT INTO Test (DateTimeValue) VALUES ('1/1/2010 5:00 PM')
INSERT INTO Test (DateTimeValue) VALUES ('1/1/2010 6:00 PM')
INSERT INTO Test (DateTimeValue) VALUES ('1/1/2010 7:00 PM')

Я создал ссылку ODBC на эту таблицу в MS Access 2007

, а затем создал следующий запрос, который приводит к 27 записям, которые имеют значение времени между 9: 00:00 и 17:00

SELECT id, DateTimeValue
FROM dbo_Test
WHERE TimeValue(DateTimeValue) Between #12/30/1899 9:0:0# And #12/30/1899 17:0:0#
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...