0

处理将日期存储为字符串格式的遗留项目

'6/1/2013'

我正在尝试执行的日期范围过滤器示例:

 table.filter := 'stringdate >= ' + QuotedStr(adatepicker.text) + ' and ' +
     'stringdate <= ' + QuotedStr(enddatepicker.text);

显然这是行不通的。设置日期范围过滤器时,数据不正确,因为我们正在对日期进行字符串排序。

在计划稍后迁移到正确的日期数据类型时,我可以通过哪些方法快速破解它以使其工作?

4

3 回答 3

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;
于 2013-06-20T22:36:11.437 回答
3

我认为,您仍然可以比较存储为字符串或 varchar 的日期,但这肯定是一种不好的做法,因为您需要将此字符串转换为日期数据类型才能在它们之间进行比较。如果您在列上定义了索引,则不能再使用它们,因为该列将被转换,并且会导致大型数据库的性能下降。

比较日期的示例(从 SQL 的角度来看)如下所示:

SELECT *
FROM   tableName
WHERE  CONVERT(DATETIME, dateSTRColumn, XXX) > GETDATE()

其中 XXX 是存储为字符串的日期的当前格式。

或换句话说:-

SELECT convert(varchar(20), dateSTRColumn, 121) FROM tableName

这应该给你一些想法。

否则,您可能必须自己编写一个简单的自定义函数。

或更改数据库。

于 2013-06-20T22:31:47.813 回答
0

在 delphi 和 adotables 和 .filter 属性上,您可以编写代码:

  mytable.filter:='mydatefield=#2018-12-31#';

  mytable.fittered:=true;
于 2019-01-10T10:21:02.557 回答