Econverter 错误从 sqlite 数据库读取日期时间

Econverter error reading datetime from sqlite database

我有一个带有 table 的 SQLite 数据库,其中一列是 DATETIME 的一种类型。 DATETIMESQLitetable中的格式为yyyy-mm-dd hh:nn:ssDATETIME在pc中的格式为mm/dd/yyyy hh:nn:ss ampm。当我将日期写入数据库时​​,它会自动转换为 yyyy-mm-dd hh:nn:ss 格式。但是当我尝试从 table 读取它时,我得到 econverter 错误,它说 yyyy-mm-dd hh:nn:ss 不是正确的格式。我的 query 看起来像这样:

sqlQuery.SQL.Text := 'SELECT MAX(Pradzia) FROM Pamainos';
sqlQuery.Open();
ShiftPradzia := sqlQuery.Fields[0].AsDateTime; <-- I do get error here
sqlQuery.Close;

如果我像那样更改 Query,那么我不会收到任何错误:

sqlQuery.SQL.Text := 'SELECT Pradzia FROM Pamainos WHERE ID = :_ID';
sqlQuery.Params.ParamByName('_ID').Value := fShiftID;
sqlQuery.Open();
ShiftPradzia := sqlQuery.Fields[0].AsDateTime;
sqlQuery.Close;

编辑: 确切的错误消息:

Project ProjectName.exe raised exception class EConverterError with message "2020-12-19 13:34:24.743" is not a valid date and time.

编辑2: 也可以这样工作:

sqlQuery.SQL.Text := 'SELECT Pradzia FROM Pamainos WHERE Pradzia = (SELECT MAX(Pradzia) FROM Pamainos)';

SQLite 没有 DATETIME 数据类型(Datatypes In SQLite Version 3)。
对于 Unix 时间戳,所有日期时间值存储为 TEXT,或 INTEGER,对于儒略日,存储为 REAL

我在另一个有类似问题的论坛中发现了这个:sqlite .AsDateTime error cannot access field as type DateTime,答案是:

If you are using concatenation, aggregating functions (MAX, AVG, ...), etc., SQLite returns the Unknown type for such fields. For correct data display, you should use DataTypeMapping.

不幸的是,答案提供的 link 已损坏。

也许您可以尝试将查询返回的值显式转换为 TEXT:

SELECT CAST(MAX(Pradzia) AS TEXT) FROM Pamainos

来自Using SQLite with FireDAC

For an expression in a SELECT list, SQLite avoids type name information. When the result set is not empty, FireDAC uses the value data types from the first record. When empty, FireDAC describes those columns as dtWideString. To explicitly specify the column data type, append :: to the column alias

因此:

sqlQuery.SQL.Text := 'SELECT MAX(Pradzia) as "MaxPradzia::datetime" FROM Pamainos';

另外你必须确保FDConnection.Params.Values['DateTimeFormat'] := 'string';这是默认设置。