【问题标题】:Econverter error reading datetime from sqlite database从 sqlite 数据库读取日期时间的转换器错误
【发布时间】:2020-12-19 13:01:10
【问题描述】:

我有一个SQLite 数据库,其中一个表的类型为DATETIMESQLite表中DATETIME的格式为yyyy-mm-dd hh:nn:ss,PC中DATETIME的格式为mm/dd/yyyy hh:nn:ss ampm。当我将日期写入数据库时​​,它会自动转换为格式yyyy-mm-dd hh:nn:ss。但是当我尝试从表中读取它时,我得到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 引发异常类 EConverterError 消息“2020-12-19 13:34:24.743”不是有效的日期和时间。

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

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

【问题讨论】:

  • 您应该给出您收到的确切错误消息以及在哪个代码行上。在访问结果集中的字段之前,您必须验证实际上至少有一个:如果不是 sqlQuery.EOF then begin ... end;并且当您要转换为 TDateTime 时,您必须确保字段值具有兼容的格式。
  • @fpiette 添加了 excat 错误消息。
  • 当您的默认日期格式为mm/dd/yyyy hh:nn:ss ampm 时,文本2020-12-19 无法转换,因为202 不是有效的mm。解决方案:设置.AsDateTime()使用的日期格式,或者使用你喜欢的文本转换为TDateTime

标签: sqlite datetime delphi firedac delphi-10.2-tokyo


【解决方案1】:

来自Using SQLite with FireDAC

对于 SELECT 列表中的表达式,SQLite 避免使用类型名称 信息。当结果集不为空时,FireDAC 使用该值 第一条记录的数据类型。当为空时,FireDAC 描述那些 列作为 dtWideString。要显式指定列数据类型, 将 :: 附加到列别名

因此:

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

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

【讨论】:

    【解决方案2】:

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

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

    如果您使用连接、聚合函数(MAX、AVG、...), 等等,SQLite 为这些字段返回未知类型。为了正确 数据显示,你应该使用DataTypeMapping。

    很遗憾,答案提供的链接已损坏。

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

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

    【讨论】:

    猜你喜欢
    • 2017-09-02
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多