SQLite-Datenbank anlegen, welche Datentypen?

Stefke

Benutzer
Beiträge
12
Hallo in die Runde, ich möchte eine Datenbank anlegen in welcher Sensordaten von Thingspeak gespeichert werden. Die Werte werden von Thingspeak als String geliefert.
Wie es möglich die Spalte "Datum" nach Datum von - bis zu filtern? Einen anderen Datentyp verwenden? String zu Float?

Danke - Stefan

Der Spaltenaufbau ist wie folgt:
Datumlfd. NummerTemperaturLuftfeuchteHeizer_on_off
'2024-05-22T07:28:01Z'9864'7.5''91.4''0'
 
Werbung:
was mir auffällt:
die erste Spalte ist ein Timestamp (ein Datum mit Zeit), kein reines Datum.

Ich würde die Spalte "Datum", wenn die Einträge direkt als String geliefert werden vorerst ein wenig mit casts befassen, wie man einen String zu einem Datum umformen kann, damit man auch nach einem Datumswert filtern kann.

Schnelles Beispiel (PostgreSQL im Einsatz):
1.: deine Tabelle erstellen
Code:
create table stefan(datum text, ifd_nummer integer, temperatur text, luftfeuchte text, heizer_on_off text);

2.: deiner Tabelle Datensätze hinzufügen
Code:
insert into stefan values ('2024-05-22T07:28:01Z', 9864, '7.5', '91.4', '0');
insert into stefan values ('2024-08-22T07:28:01Z', 9864, '7.5', '91.4', '0');

3. aus der Tabelle mit casts Werte filtern
Code:
select * from stefan where to_date(datum, 'YYYY-MM-DD') = '2024-05-22'::date;
Result:
Code:
"2024-05-22T07:28:01Z"    9864    "7.5"    "91.4"    "0"

4.: aus der Tabelle anhand von casts und between filtern
Code:
select * from stefan where to_date(datum, 'YYYY-MM-DD') between '2024-06-01'::date and '2024-10-1'::date
Result:
Code:
"2024-08-22T07:28:01Z"    9864    "7.5"    "91.4"    "0"

ABER(!):
gewöhn dir nicht an, so zu arbeiten.

Verwende Spaltentypen, wo vorhanden, ich würde es so aufbauen:
Code:
create table stefan(datum date, ifd_nummer integer, temperatur float, luftfeuchte float, heizer_on_off boolean);

Dann kann man, falls man das ausbauen möchte später mit den Werten auch besser arbeiten.
 
Ich würde immer so direkt am Inhalt arbeiten, wie möglich.
Warum denn auch nicht?

Du, oder andere, müssten den Datumswert nichtmehr umformen, damit es also auch mit anderen Programmiersprachen flüssig verläuft.

Meiner Meinung nach gibt es da keine gegensätzliche Meinung, (sprich es wäre garnicht in Frage zu stellen), vl. denke ich heute so, weil ich bereits länger mit SQL arbeite und auch als Küken angefangen habe (hier).

Du kannst im Python-Programm einfach den gelieferten String in der SQL-Abfrage zu einem Datum umformen, welcher in der Datenbank eingetragen wird.

Wie würde ich (jetzt nur das mit Datum) auf die schnelle mit deiner Basis anpassen?

1.: eine leere Spalte vom Typ "Date" hinzufügen
Code:
alter table stefan add column datum_date date;

2.: die Werte aus der bisherigen Spalte in die neue Spalte übertragen
Code:
update stefan set datum_date = to_date(datum, 'YYYY-MM-DD');

damit kannst du statt der text-spalte mit einer date-spalte arbeiten.

3.: die alte Spalte von der Tabelle entfernen, damit redundanz vermieden wird

Code:
alter table stefan drop column datum;

;) hoffe es hilft :D
 
Werbung:
SQLite hat eigentlich keine Datentypen. Die Angabe beim CREATE TABLE ist optional. Man kann Spalten ganz ohne Type definieren oder auch mit ausgedachten Namen. Man kann in jede Spalte alles reinschreiben.

Der folgende Code läuft ohne Fehler

Code:
create table t
(
  datum timestamp,
  lfd_nummer ganze_zahlen,
  luftfeuchte,
  heizer_on_off boolean
);
insert into t (datum, lfd_nummer, luftfeuchte, heizer_on_off)
values ('2024-05-22T07:28:01Z', 9864, 7.5, 0);
Aber leider auch:
Code:
insert into t (datum, lfd_nummer, luftfeuchte, heizer_on_off)
values ('gestern', 'zweiundzwanzig', 'zu viel', 'manchmal');

Es bringt also nichts den Typ einer Spalte zu ändern oder umständlich über eine neue Spalte zu gehen.

Seit einer Weile gibt es "STRICT" Tabellen die eine Wertprüfung machen, wie man es von anderen Datenbanksystemen kennt. Aber letztendlich werden nur Integer und Dezimalzahlen geprüft. Man kann keine STRICT Tabelle mit einem TIMESTAMP oder DATE anlegen.
 
Zurück
Oben