Access 2007: запрос поля DateTime между двумя значениями Short Date - PullRequest
1 голос
/ 07 октября 2009

У меня есть форма, содержащая два текстовых поля для ввода пользователя. Оба текстовых поля имеют формат свойства «Короткая дата». Одним из них является «дата начала», а другим - «дата окончания». У меня также есть несколько таблиц, каждая с полем DateTime ("studystartdatetime"). Я хотел бы иметь возможность запрашивать эти таблицы, но ограничить результаты строк, чьи поля DateTime между введенными датами (включительно). В настоящее время условие:

WHERE s.studystartdatetime BETWEEN forms!frmMain!txtstartdate AND forms!frmmain!txtenddate

Это, однако, не возвращает строки, которые произошли в указанной конечной дате.

Я пробовал каждую комбинацию CDate, Format и DateValue, в которой я мог придумать, чтобы обернуть одно или все эти поля, но я всегда получаю одну и ту же загадочную ошибку:

Выражение введено неправильно или оно слишком сложно для оценки. Например, числовое выражение может содержать слишком много сложных элементов. Попробуйте упростить выражение, назначив его части переменным.

Некоторые примеры условий, которые я пробовал:

WHERE CDate(Format(s.studystartdatetime, "yyyy/mm/dd")) BETWEEN forms!frmMain!txtstartdate AND forms!frmmain!txtenddate

WHERE DateValue(Format(s.studystartdatetime, "yyyy/mm/dd")) BETWEEN forms!frmMain!txtstartdate AND forms!frmmain!txtenddate

WHERE CDate(Format(s.studystartdatetime, "yyyy/mm/dd")) BETWEEN CDate(Format(forms!frmMain!txtstartdate, "yyyy/mm/dd")) AND CDate(Format(forms!frmmain!txtenddate, "yyyy/mm/dd"))

WHERE DateValue(Format(s.studystartdatetime, "yyyy/mm/dd")) BETWEEN CDate(Format(forms!frmMain!txtstartdate, "yyyy/mm/dd")) AND CDate(Format(forms!frmmain!txtenddate, "yyyy/mm/dd"))

WHERE DateValue(Format(s.studystartdatetime, "Short Date")) BETWEEN forms!frmMain!txtstartdate AND forms!frmmain!txtenddate

Etc.

Любой вклад в это будет принята с благодарностью:)

Ответы [ 2 ]

2 голосов
/ 07 октября 2009

То, что происходит, заключается в том, что ваши краткосрочные данные дают значения даты и времени в полночь в начале дня, который ввел пользователь. Таким образом, диапазон с 2009-1-1 по 2009-1-10 (или любой другой формат коротких дат, используемый в вашей системе) выполняет поиск событий с самого начала 1 января до самого начала января 10 и исключая события, которые произошли позже 10 января.

Чтобы исправить, добавьте 1 к конечной дате, которую пользователь вводит в поиск. Поиск будет выполняться с самого начала 1 января до самого начала 11 января, включая все события 10 января.

Наконец, события, произошедшие в ровно в полночь 11 января, могут таким образом повлиять на ваши результаты, поэтому вместо использования МЕЖДУ вы должны использовать

studystartdatetime> = формы! FrmMain! TxtStartDate И studystartdatetime <формы! FrmMain! TxtEndDate + 1 </p>

0 голосов
/ 09 октября 2009

Ответ Ларри был правильным для вас, но позвольте мне остановиться на некоторых вопросах, поднятых здесь.

  1. необходимо различать формат даты и дату хранения. В ядре базы данных Jet / ACE (ядро базы данных Access по умолчанию) даты хранятся в виде целого числа для дня и десятичной части для времени. Вот почему вы можете добавить цифру (или десятичную дробь) к дате и получить правильный результат, потому что целая числовая часть базового представления даты представляет дни с 30 декабря 1899 г. (причина, по которой это не декабрь 31-е сложное - кто-то напутал в подсчете високосных лет, и поэтому была написана целая куча программ с неверными предположениями о том, когда 31 декабря 1899 года действительно было).

  2. «короткая дата» - это формат даты, стандартный m / d / yy (или m / d / yyyy, в зависимости от ваших локальных настроек в Windows и Access). Он не имеет ничего общего с фактическими значениями даты, хранящимися в вашей таблице, но может иметь огромный эффект, если вы работаете с результатами форматирования. Например, Format (Date (), "m / d / yyyy") возвращает строку, а не значение даты. Это строка, которая может быть неявно приведена к значению даты, и очень часто это происходит прозрачно. Но вы все равно должны понимать, что функция Format () возвращает строку, и эта строка не всегда будет считаться датой.

  3. Jet / ACE SQL ожидает, что отформатированные даты будут передаваться в американском порядке, нелогично m / d / yyyy, вместо более логичного d / m / yyyy или, что еще лучше, стандарта ISO гггг / м / д. По этой причине каждый раз, когда вы запускаете свое приложение с неамериканским языковым стандартом для Windows, вам необходимо четко указывать даты. Это означает приведение ваших дат к не двусмысленному формату (д / ммм / гггг работает, потому что он задает день цифрами и месяц в письмах), или обрабатывает все ваши даты с помощью функции DateSerial (). Это относится к критериям даты в предложении WHERE или в любом месте вашего оператора SELECT, в котором вы выполняете вычисления даты - передайте дату в функции в недвусмысленном формате или с помощью DateSerial (), и вы избежите этой проблемы.

...