SQLite:将字符串转换为Date

时间:2018-01-02 16:28:05

标签: sqlite date-formatting

我正在尝试将字符串中的datetime - 2017年12月11日00:00:00 AM转换为SQLite中的YYYY-MM-DD格式。这些表最初是在Oracle中,因此to_date()能够将文本转换为日期。但是我如何在SQLite中实现这一目标? date和strftime函数无法将月份作为转换文本。

谢谢!

1 个答案:

答案 0 :(得分:0)

你必须通过代码来完成它,如此(DELPHI):

主要过程:

procedure TfrmMain.btn2Click(Sender: TObject);
var
  DB: TSQLite3Database;//helper class
  Stmt: TSQLite3Statement;//helper class
begin
  DB := TSQLite3Database.Create;
  DB.Open(ExtractFilepath(application.exename) + 'YourDB.db3');

  // here you set the function that will SQLite use to call in the query
  DB.fnTO_MouliTr_DATE;

  // prepare statement and fire it after 
  Stmt :=  DB.Prepare('update YourTable set NewDate = TO_MouliTr_DATE(NewDate)');

  Stmt.Step;

  Stmt.Free;
end;

调用sqlite3_create_function_v2

procedure TSQLite3Database.fnTO_MouliTr_DATE;
begin
  sqlite3_create_function_v2(FHandle, 'TO_MouliTr_DATE', 1 , SQLITE_ANY, nil,InternalSQLFunctionTO_MouliTr_DATE,nil,nil, nil);
end;

最终将完成工作的程序

procedure InternalSQLFunctionTO_MouliTr_DATE(ctx: PSQLite3Context; n: Integer; apVal:
    PPSQLite3ValueArray); cdecl;

var StartPos: integer;
  s1: string;
  DT: TDateTime;

begin
  case n of
    1: StartPos := 1;
  else
    begin
      raise ESQLite3Error.Create('The TO_MouliTr_DATE function requires 1 argument.');
      exit;
    end;
  end;
  if (sqlite3_value_type(apVal[0])=SQLITE_NULL) then
    sqlite3_result_text(ctx, PAnsiChar(''), Length(''), SQLITE_TRANSIENT)
  else
  begin

    s1 := sqlite3_value_text(apVal[0]);

    // HERE YOUR LOGIC
    DT := StrToDateTime(s1);

    s1 := FormatDateTime('yyyy-mm-dd', DT);

    sqlite3_result_text(ctx, PAnsiChar(s1), Length(s1), SQLITE_TRANSIENT);

  end;
end;

遗憾的是,由于StrToDateTime无法将给定的字符串转换为日期时间,因此我无法完成该工作,但我只想指出您应该针对您的问题采取的方向。

希望这会有所帮助