Econverter 错误从 sqlite 数据库读取日期时间
Econverter error reading datetime from sqlite database
我有一个带有 table 的 SQLite
数据库,其中一列是 DATETIME
的一种类型。 DATETIME
在SQLite
table中的格式为yyyy-mm-dd hh:nn:ss
,DATETIME
在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
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';
这是默认设置。
我有一个带有 table 的 SQLite
数据库,其中一列是 DATETIME
的一种类型。 DATETIME
在SQLite
table中的格式为yyyy-mm-dd hh:nn:ss
,DATETIME
在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
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';
这是默认设置。