如何在TDateTime字段上过滤Delphi中的数据集

时间:2011-03-02 18:23:53

标签: delphi datetime filter

我有一个我需要按时间过滤的数据集。例如我想要记录TDateTime字段中包含的时间是在上午6:00到下午6: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 个答案:

答案 0 :(得分:8)

我认为这可能取决于短时间格式,但这适用于我使用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 :(得分:1)

Delphi中的

TDateTime是double类型,其中整数部分是自18/30/1899以来的天数,小数(小数)部分是时间。

中午时间(没有日期部分)将表示为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返回小数部分,只是为了让代码清楚地表明您只考虑了值的时间部分。

答案 2 :(得分:0)

我不使用ADO而是使用Zeos,但渲染为float

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

适合我。