2012-06-18 2 views
0

Я работаю над старым программным обеспечением, которое использует базу данных .mdb.DateTime issue with vb and mdb

Я удался создать соединение с базой данных, и я могу запустить SQL запросов просто отлично, когда дело доходит до запрограммированных запросов, как это:

SELECT COUNT(*) AS test FROM shifts WHERE EmpId = '2' AND DateOpen <= '3/28/2007'

Двигаясь дальше, я заменил 2 с выражение в зависимости от выбора пользователя, как так

Employees(employe.SelectedIndex)

Это работало отлично тоже.

Теперь, когда я пытался заменить дату с startDate.Value.ToShortDateString я начал сталкиваются со многими проблемами конверсии и я, наконец, что-то, что работал так что мой где предложение стало так:

WHERE EmpId = '" & Employees(employe.SelectedIndex) & "' AND DateDiff('d', DateOpen, '" & endDate.Value.ToShortDateString & "') <= 0

Теперь я выбрал то же самое дата, указанная в запросе выше, запрос выполняется без проблем, но удивительно, что я получил нулевой результат, что не имеет для меня никакого смысла, потому что запрос со значениями, которые уже там вернулись, насчитывал 2.

I использовал некоторый отладочный вывод, чтобы убедиться, что запрос и я получаю тот же запрос, что и выше, когда я выбираю дату.

Если у вас есть идеи, почему это не работает или у вас есть какие-либо намеки на правильный способ сделать это, я был бы признателен за все ваши данные.

Заранее спасибо

+0

Можете ли вы поместить сравнение «датифф» в свой «запрограммированный» запрос и посмотреть, возвращает ли это то, что вы ожидаете? –

+2

toShortDateString? Мне не нравится VB6, какой у объекта этот метод? – Bob77

+1

DateDiff в запросе доступа принимает (строка, дата, дата), у вас есть 'DateDiff ('d', DateOpen, '' и endDate &" ') '(игнорируя дополнительные функции), который является' string, date, string' , попробуйте 'DateDiff ('d', DateOpen, #" & endDate & "#)' Вы можете столкнуться с проблемами локали, и в этом случае вам придется форматировать enddate в год, месяц, день. – Fionnuala

ответ

0

В результате я использовал BETWEEN в запросе, и с параметрами запрос работает как шарм!

WHERE (DateOpen BETWEEN @DStart AND @DEnd) 
0

Я предлагаю вам избегать использования форматированных строк при работе с датами в MS Access и VBA.

Совет: VBA и MS Access хранят даты как двойные значения, неотъемлемая часть представляет собой дату (дни с 1 января., 1900), а десятичная часть представляет время (в доли секунды). E.G .: 20 июня 2012 г., 05:57 хранится как номер 41080.2408.

Вместо использования форматированных строк вы можете использовать двойное значение для сравнения дат так же, как вы сравниваете любую пару чисел. Если значения хранятся в полях с типом «Дата/время», вы можете просто использовать CDbl() для преобразования даты в двойное значение, а затем сравнить ее с другим двойным.

Это сработало для меня. Надеюсь, это поможет вам.