Ну что же, решил вспомнить старое. Если честно, то не по своей воле, а по просьбе одного читателя моего блога, который попросил показать, как можно выполнять запросы к БД MS Access и сравнивать в условии даты. По его словам у него возникли проблемы при сравнении дат (то есть по выборке записей, по условию дат), если тип поля в БД MS Access стоит — Дата/Время, то появляется примерно ошибки следующие:
- Неверный синтаксис SQL-запросов
- Несоответствие типов данных
Ну тут я предложу два варианта решения проблемы, возможно их и больше.
Первый вариант довольно простой. Создаем базу в MS Access, и создаем необходимые Вам поля (у меня id-Счетчик, dat-Текстовый), а поле, где должна находиться дата, указываем тип — Текстовый. То есть, у нас дата будет храниться, как обычный текст, записывать Вы сможете в любом формате (в котором Вам нужно), а делать SQL-запрос и в условии сравнивать текстовые значения — это без проблем, запрос будет выполнен без всяких синтаксических ошибок.
Давайте создадим наш проект. Тут немного, возможно, будет удивительно, но теперь большинство исходников будут выкладываться на блог в проекте Delphi XE. Это, во-первых, связано с переходом с Windows XP на Windows 7 (давно пора уже было это сделать).
В своем проекте, я установил следующие компоненты:
- TADOConnection
- TADOQuery
- TButton
Отображать данные, мы нигде не будем, а просто, для проверки выведем их в цикле, чтобы просто убедиться, что наш запрос выполнен правильно.
Вот такая у меня структура вышла моей БД.
А вот пример такого запроса, но не забывайте, что в БД Access в поле dat, стоит тип — Текстовый.
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
try
with ADOQuery1 do
begin
SQL.Clear;
SQL.Add('SELECT * FROM MyTable WHERE dat='''+'07.05.2011'+'''');
Active:=True;
for i := 0 to RecordCount-1 do
begin
ShowMessage(FieldByName('dat').AsVariant);
end;
end;
finally
//-//-//-//-//-//
end;
end;
Данный запрос, выводит одну запись, при следующих данных в таблице:
Что касается второго метода решения данной проблемы, то тут, мы будет устанавливать в поле dat тип - Дата/Время и установим формат — дд.мм.гггг (Краткий формат даты). Ниже приведена структура БД (поля и их тип данных).
Тут, нам необходимо будет использовать параметры. Для этого, выделяем компонент TADOQuery и в свойстве Parameters, создаем новый параметр, где в свойстве Name задаем — data, а в свойстве DataType - ftDataTime.
Дальше, на событие OnClick кнопки, пишем следующий код:
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
try
with ADOQuery1 do
begin
SQL.Clear;
SQL.Add('SELECT * FROM MyTable WHERE dat=:data');
Parameters.ParamByName('data').Value:=FormatDateTime('dd.mm.yyyy',Date);
Active:=True;
for i := 0 to RecordCount-1 do
begin
ShowMessage(FieldByName('dat').AsVariant);
end;
end;
finally
//-//-//-//-//-//
end;
end;
При значениях в таблице:
У меня вывело 1 запись, что говорит о работоспособности запроса и программы в целом.
Ну и напоследок, хотел бы сказать, про сами запросы в MS Access, на выборку записей по условию даты. В самом MS Access, в запросе, дату в условии, необходимо заключать в знаки #. Пример:
SELECT * FROM MyTable WHERE dat BETWEEN #09.02.2011# AND #08.05.2011#
Но, в Delphi, данный метод не работает, поэтому приходится работать, при помощи параметров.