簡體   English   中英

Delphi 10.1 FireDac和Sqlite日期問題

[英]Delphi 10.1 FireDac and Sqlite date issue

我有一個在我的Android應用程序中創建的表。

CREATE TABLE IF NOT EXISTS `TimeSheet  
  `TKey` INTEGER PRIMARY KEY AUTOINCREMENT,
  `PriKey1` INT NOT NULL,
  `PriKey2` DEFAULT NULL,
  `PriKey3` DEFAULT NULL,
  `STime` DATETIME DEFAULT NULL,
  `ETime` DATETIME DEFAULT NULL,
  `Note` BLOB);

我已經使用不同的日期加載了一些數據。

而且我需要過濾,以便一次只顯示一天的數據。

這樣做的Delphi代碼如下

FD := "a date";
QuTimeSheet.Active := False;
QuTimeSheet.SQL.Text := 'Select Date(STime) as SDate, Time(STime) as STime,     Time(ETime) as ETime, Task.TaskName From TimeSheet' + #13 + #10 +
'  LEFT JOIN task ON (TimeSheet.PriKey1 = task.TKey)';// + #13 + #10 +
'Where SDate = ''' + formatdatetime('YYYY-MM-DD',FD) + ''';';
QuTimeSheet.Active := True;

如果刪除where語句,SDate的日期為DD-MM-1800。 這告訴我Date(STime)劑量在Delphi中起作用。

還嘗試了strfTime(%Y-&M-%D,STime)作為SDate

德爾福劑量似乎喜歡strfTime android設備崩潰。

嘗試使用過濾器

  QuTimeSheet.Filtered := False;
  QuTimeSheet.Filter := 'SDate = ''' + formatdatetime('YYYY-MM-DD',FD) + '''';
  QuTimeSheet.Filtered := True;

要么

  QuTimeSheet.Filtered := False;
  QuTimeSheet.Filter := 'SDate = ''' + Datetostr(FD) + '''';
  QuTimeSheet.Filtered := True;

這不會過濾任何內容。

這是一個如此簡單的where語句,可在MySql和Sqlite turorials網站上使用。

為什么不在我的應用中。

停止連接您的SQL,並改用參數。 另外,停止自己將事物從一種類型轉換為另一種類型,並讓數據庫驅動程序為您完成; 它知道如何引用需要引用的內容(而不引用不需要的內容)以及如何正確格式化日期值。 它還可以防止SQL注入。

這樣的事情應該可以工作(未經測試,因為我在這台機器上沒有SQLite):

var
  TheDate: TDateTime;
begin
  TheDate := EncodeDate(2015, 1, 1);
  QuTimeSheet.Active := False;
  QuTimeSheet.SQL.Text := 'Select Date(STime) as SDate, Time(STime) as STime,'#13 +
                        ' Time(ETime) as ETime, Task.TaskName From TimeSheet'#13 +
                        ' LEFT JOIN task ON (TimeSheet.PriKey1 = task.TKey)'#13 +
                        'Where SDate = :SDateVal';
  QuTimeSheet.ParamByName('SDateVal').AsDateTime := TheDate;
  QuTimeSheet.Active := True;
end;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM