我正在尝试将字符串中的datetime - 2017年12月11日00:00:00 AM转换为SQLite中的YYYY-MM-DD格式。这些表最初是在Oracle中,因此to_date()能够将文本转换为日期。但是我如何在SQLite中实现这一目标? date和strftime函数无法将月份作为转换文本。
谢谢!
答案 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无法将给定的字符串转换为日期时间,因此我无法完成该工作,但我只想指出您应该针对您的问题采取的方向。
希望这会有所帮助