дата поиска по дате и времени поле запроса не работает

У меня есть запрос ниже

 sql_query = "select * from bericht where fromtime = " & Me.von & " and b_date = #" & Me.l_date & "#"

он печатает следующую строку с помощью отладки.

select * from bericht where fromtime = 6 and b_date = #1/30/2020#

в таблице b_date равно dateTime field. ( связанная таблица с сервера SQL в Msaccess)

в этой таблице есть данные с 1/30/2020 2:00:00 PM, где fromtime также равно 6.

почему запрос не вернул никаких данных?

может msaccess не может искать дату в поле даты и времени?

PS: fromtime - целое число, а не поле времени.


person Tarun. P    schedule 31.01.2020    source источник


Ответы (2)


Потому что #1/30/2020# ‹> 1/30/2020 2:00:00 PM.

Преобразуйте столбец в дату, а не дату и время, прежде чем выполнять сравнение.

... and DateValue(b_date) = #" & Me.l_date & "#"

Это вернет все строки с этой даты, которые соответствуют вашему другому условию.

person Eric Brandt    schedule 31.01.2020
comment
оно работает. это означает, что доступ ms не рассматривал мои значения как дату, пока я не использовал DateValue. - person Tarun. P; 31.01.2020
comment
Нет, это не совсем то. При сравнении даты с датой и временем Access и любая другая известная мне база данных предполагают, что дата имеет значение времени, равное полуночи. Итак, вы сравнивали 1/30/2020 2:00:00 PM с 1/30/2020 12:00:00 AM. Это разные значения, поэтому совпадения не было. Использование функции DateValue удаляет время из значения в таблице и просто сравнивает даты, игнорируя компонент времени. - person Eric Brandt; 31.01.2020

Точно так же рассмотрите возможность поиска всех дат и времени в диапазоне дат, поскольку DateValue может иметь проблемы с эффективностью:

select * from bericht 
where fromtime = 6 
  and b_date >= CDate("2020-01-30") 
  and b_date < CDate("2020-01-30") + 1

И указать прямо на поле формы/отчета. Сохраните ниже как сохраненный запрос и вызовите его по мере необходимости в VBA с помощью DoCmd.OpenQuery:

select * from bericht 
where fromtime = Forms!myForm!von 
  and b_date >= [Forms!myForm!l_date]
  and b_date < ([Forms!myForm!l_date] + 1)

Если вы используете запрос для построения наборов записей, по-прежнему используйте предпочтительный метод параметризации и по-прежнему используйте сохраненный запрос, а в VBA откройте его с помощью QueryDefs и привяжите необходимые параметры во время выполнения:

SQL

parameters [myint] int, [mydate] date;
select * from bericht 
where fromtime = [myint] 
  and b_date >= [mydate]
  and b_date < ([mydate] + 1)

VBA

Dim qDef As QueryDef
Dim rst As Recordset

Set qdef = CurrentDb.QueryDefs("mySavedQuery")

qdef!myint = Me.von
qdef!myDate = Me.l_date

Set rst = qdef.OpenRecordset()

...
person Parfait    schedule 31.01.2020