Datum und Zeit formatieren und in sqlite3 ablegen

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
DL3AD
Beiträge: 478
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
CPU-Target: 64Bit
Wohnort: Rügen

Datum und Zeit formatieren und in sqlite3 ablegen

Beitrag von DL3AD »

Hallo,
ich habe Rohdaten in denen u.a. Datum und Zeit in einer CSV Datei vorhanden sind.
Nun möchte ich diese Daten in eine sqlite3 Datenbank schreiben damit ich bequem mit SQL diverse Auswertungen machen kann.
Das schreiben in die sqlite3 funktioniert soweit.
Nur mit dem Datum habe ich ein Problem.

Aus den Rohtaten parse ich das Datum und die Zeit als String wie folgt

Datum: 14.09.2021
Zeit: 17:45:51

In der sqlite3 möchte ich den Datentyp DateTime verwenden um möglichst elegant mittels SQL zu arbeiten.
Das Einfügen möchte ich so realisieren.

Code: Alles auswählen

Query.FieldByName('DatumZeit').AsDateTime:=
Das Zielformat sollte also "YYYY-MM-DD HH:MM:SS" sein.
Ich habe mit FormatDatetime herumprobiert - habe es leider nicht hin bekommen.
Wie lößt man das am besten ?

Frank

Sieben
Beiträge: 202
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: Datum und Zeit formatieren und in sqlite3 ablegen

Beitrag von Sieben »

Das Zielformat sollte also "YYYY-MM-DD HH:MM:SS" sein.
Das ist aber ein String-Format, kein DateTime. Du kannst dir aus den Ausgangsdaten ein TDateTime erzeugen und das mittels FormatDateTime dann wieder in das andere Format umwandeln, etwa:

Code: Alles auswählen

var sDate, sTime, sFieldVal: string;
    aDateTime: TDateTime;
//...
  sDate := '14.09.2021';
  sTime := '17:45:51';
  aDateTime := StrToDate(sDate) + StrToTime(sTime);
  sFieldVal := FormatDateTime('YYYY-MM-DD HH:NN:SS', aDateTime);
und den String sFieldVal schreibst du dann mit AsString in das jeweilige Feld. Oder kurz:

Code: Alles auswählen

const cISOFormat = 'YYYY-MM-DD HH:NN:SS';
//...
Query.FieldByName('DatumZeit').AsString := FormatDateTime(cISOFormat, StrToDate(sDate)+StrToTime(sTime));

DL3AD
Beiträge: 478
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
CPU-Target: 64Bit
Wohnort: Rügen

Re: Datum und Zeit formatieren und in sqlite3 ablegen

Beitrag von DL3AD »

Hallo sieben,
Danke für deine Antwort,
Habe das mal probiert - er wirft einen Fehler aus '10.09.2021' is not a valide date format
:shock:

DL3AD
Beiträge: 478
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
CPU-Target: 64Bit
Wohnort: Rügen

Re: Datum und Zeit formatieren und in sqlite3 ablegen

Beitrag von DL3AD »

Hallo,
habe es nun zum laufen bekommen

Code: Alles auswählen

var
  sDate    : string;
  sTime    : string;
  sFieldVal: string;
  aDateTime: TDateTime;
begin
  Memo1.Clear;
  sDate:= '14.09.2021';
  sTime:= '17:45:51';
  aDateTime:= ScanDateTime('DD.MM.YYYY hh:mm:ss', sDate +' '+ sTime);
  sFieldVal:= FormatDateTime('YYYY-MM-DD HH:NN:SS' , aDateTime);
  Memo1.Append(sFieldVal);
end;    

Sieben
Beiträge: 202
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: Datum und Zeit formatieren und in sqlite3 ablegen

Beitrag von Sieben »

Habe das mal probiert - er wirft einen Fehler aus '10.09.2021' is not a valide date format
Sind deine DefaultFormatSettings lokalisiert? Unter Unix solltest du dafür die Unit cLocale eingebunden haben. Aber wenn die Ursprungsdaten immer in diesem Format vorliegen, spricht natürlich auch nichts dagegen, das fest zu definieren, im Gegenteil.

Antworten