Как я могу отфильтровать набор данных в Delphi на поле TDateTime - PullRequest
1 голос
/ 02 марта 2011

У меня есть набор данных, который мне нужно отфильтровать по времени.например, мне нужны записи, в которых время, содержащееся в поле TDateTime, находится между 6:00 и 18:00.

Мой набор данных содержит поле с именем time_of_day типа TDateTime.Значение, назначенное для поля, - это время без даты.

Я попытался создать строку фильтра, используя как строковое представление времени (time_of_day >= '6:00 AM' and time_of_day <= '6:00 PM'), так и с использованием представления с плавающей запятой (time_of_day >= 0.25 and time_of_day < 0.75), но ни одна из них не сработала.

Мне нужно знать, как создать строку фильтра для присвоения свойству TDataSet.Filter.

Ответы [ 3 ]

8 голосов
/ 02 марта 2011

Я думаю, это может зависеть от формата короткого времени, но это работает для меня, используя TADODataSet.

ADODataSet1.Filter := 'TimeField = 11:00:00';
ADODataSet1.Filtered := True;

Более полное решение - вместо этого использовать событие OnFilterRecord.

procedure TForm4.ADODataSet1FilterRecord(DataSet: TDataSet; var Accept: Boolean);
begin
    if DataSet.FieldByName('TimeField').AsDateTime = FilterValue then
        Accept := True
    else
        Accept := False
end;

Если вам нужен интервал, он будет выглядеть следующим образом.

ADODataSet1.Filter := 'TimeField >= 10:00:00 and TimeField < 11:00:00';
ADODataSet1.Filtered := True;

OnFilterRecord

procedure TForm4.ADODataSet1FilterRecord(DataSet: TDataSet; var Accept: Boolean);
begin
    if (DataSet.FieldByName('DateField').AsDateTime >= FromTime) and
         (DataSet.FieldByName('DateField').AsDateTime < ToTime) then
        Accept := True
    else
        Accept := False
end;

Если вы используете нотацию AMPM, вам нужно заключить время в '

ADODataSet1.Filter := 'TimeField >= ''10:00 AM'' and TimeField < ''11:00 AM''';
ADODataSet1.Filtered := True;

Но я бы действительно рекомендовал вместо этого OnFilterRecord, чтобы вам не приходилось беспокоиться оформаты времени.

1 голос
/ 02 марта 2011

TDateTime в Delphi - тип double, где целая часть - это количество дней с 30.12.1999, а дробная (десятичная) часть - это время.

Время полудня (без части даты) будет указано как 0,5, что означает, что 6:00 утра будет 0,25 (точно, 1 день / 24 часа * 6 часов), а 6:00 вечера будет 0,75. Простейший способ фильтрации будет:

// 6 hours after midnight
Frac(YourTimeField.AsFloat) >= (1.0 / 24.0) * 6 and
// 18 hours after midnight
Frac(YourTimeField.AsFloat) <= (1.0 / 24.0) * 18; 

Выполнение фактического расчета гарантирует, что если число не может быть точно представлено как 0,25 (например, 0,2499999999999), вы все равно получите правильное значение для сравнения.

Frac возвращает дробную часть, просто чтобы код четко указывал, что вы рассматриваете только временную часть значения.

0 голосов
/ 07 августа 2012

Я не использую ADO, но Zeos, но рендеринг как float

  xx.filter:='datefieldname > '+floattostr(strtodatetime(edit1.text));

у меня работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...