我有一个我需要按时间过滤的数据集。例如我想要记录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属性。
答案 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)
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));
适合我。