使用格式为
的日期存储为字符串的旧项目'6/1/2013'
我正在尝试执行的日期范围过滤器示例:
table.filter := 'stringdate >= ' + QuotedStr(adatepicker.text) + ' and ' +
'stringdate <= ' + QuotedStr(enddatepicker.text);
显然这不起作用。设置日期范围过滤器时,数据不正确,因为我们正在对日期进行字符串排序。
在计划以后迁移到正确的日期数据类型时,有什么方法可以快速破解它以使其工作?
答案 0 :(得分:4)
您没有指明底层DBMS是什么,因此您可以在SQL而不是过滤器中执行此操作。
如果您不能这样做并且数据集不是太大,您可以将数据库日期值转换为实际日期并在OnFilterRecord
事件中使用它们:
procedure TForm3.Table1FilterRecord(DataSet: TDataSet; var Accept: Boolean);
var
TableDate: TDateTime;
begin
TableDate := StrToDate(Table1DateField.AsString);
Accept := (TableDate >= ADatePicker.Date) and
(TableDate <= EndDatePicker.Date);
end;
答案 1 :(得分:3)
我认为,您仍然可以比较存储为字符串或varchar的日期,但这肯定是一种不好的做法,因为您需要将此字符串转换为日期数据类型以便能够在它们之间进行比较。如果在列上定义了索引,则不能再使用它们,因为将转换该列,这将导致大型数据库的性能降低。
比较日期(从SQL角度来看)的示例如下:
SELECT *
FROM tableName
WHERE CONVERT(DATETIME, dateSTRColumn, XXX) > GETDATE()
其中XXX是以字符串形式存储的日期的当前格式。
或其他方面: -
SELECT convert(varchar(20), dateSTRColumn, 121) FROM tableName
这应该会给你一些想法。
否则,您可能必须自己编写一个简单的自定义函数。
或更改数据库。
答案 2 :(得分:0)
关于delphi和adotables和.filter属性,您可以编写代码:
mytable.filter:='mydatefield=#2018-12-31#';
mytable.fittered:=true;