HOWTO · SQLite
Automatischer Zeitstempel in SQLite
In diesem Artikel besprechen wir, wie Sie den automatischen Zeitstempel in SQLite erhalten.
Auf dieser Seite
SQLite kann eine Erstellungszeit automatisch eintragen, wenn ein INSERT die Spalte mit DEFAULT CURRENT_TIMESTAMP auslässt. Wird für die Spalte ausdrücklich NULL angegeben, greift der Standardwert nicht; mit einer NOT NULL-Beschränkung schlägt der Einfügevorgang fehl. SQLite besitzt keine eigene Speicherklasse für Datum und Uhrzeit. Wählen Sie daher eine einheitliche Darstellung als Text, Ganzzahl oder Gleitkommazahl. In Python liefert sqlite3 nur dann ein datetime-Objekt zurück, wenn die Konvertierung entsprechend konfiguriert ist.
Einen automatischen Zeitstempel zu einer SQLite-Tabelle hinzufügen
Deklarieren Sie eine Zeitstempelspalte mit DEFAULT CURRENT_TIMESTAMP, zum Beispiel: CREATE TABLE events (id INTEGER PRIMARY KEY, name TEXT NOT NULL, created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP);. Bei einer Einfügung wie INSERT INTO events (name) VALUES ('launch'); wird created_at ausgelassen, daher verwendet SQLite den Standardwert. Nennt eine Einfügung created_at ausdrücklich und übergibt NULL, wird der Standardwert nicht verwendet; die Beschränkung NOT NULL weist die Einfügung zurück. Verwenden Sie in späteren Abfragen dieselben Tabellen- und Spaltennamen, zum Beispiel SELECT id, name, created_at FROM events;.
CURRENT_TIMESTAMP ist ein SQLite-Schlüsselwort, das das aktuelle Datum und die aktuelle Uhrzeit in UTC als Text im Format YYYY-MM-DD HH:MM:SS liefert. Ein Standardwert gilt für eingefügte Zeilen; er ändert sich nicht automatisch, wenn eine andere Spalte aktualisiert wird. Wenn Sie auch einen Aktualisierungszeitpunkt benötigen, setzen Sie ihn im UPDATE-Befehl oder verwenden Sie einen dafür vorgesehenen Trigger.
Eine Datums- und Uhrzeitdarstellung in SQLite wählen
SQLite-Werte verwenden die Speicherklassen TEXT, INTEGER und REAL sowie NULL und BLOB. Ein deklarierter Typname wie DATETIME oder TIMESTAMP erzeugt keinen nativen Speicherdatentyp für Datum und Uhrzeit. Die Typaffinitätsregeln von SQLite bestimmen weiterhin, wie Werte gespeichert werden. Wählen Sie daher eine Darstellung und verwenden Sie sie durchgängig.
Text ist gut lesbar und eignet sich für Datumsangaben, deren Bestandteile von der größten zur kleinsten Einheit angeordnet sind, etwa YYYY-MM-DD HH:MM:SS.SSS. Ganzzahlen können Unix-Zeit in Sekunden speichern, Gleitkommazahlen dagegen Julianische Tageswerte. Die Datums- und Uhrzeitfunktionen von SQLite können diese Darstellungen interpretieren. DATE_ADD und UNIX_TIMESTAMP sind keine SQLite-Funktionen. Verwenden Sie für unterstützte Umwandlungen die SQLite-Funktionen date(), time() und datetime().
SQLite-Zeitstempel als Python-datetime-Objekte abrufen
Das Modul sqlite3 gibt gewöhnliche SQLite-Werte entsprechend ihrer Speicherklasse als Python-Werte zurück; eine Zeichenfolge, die wie ein Zeitstempel aussieht, wird normalerweise als str zurückgegeben. Um ein Python-datetime abzurufen, registrieren Sie einen Konverter und aktivieren Sie die Auswertung deklarierter Typen. Dieses eigenständige Beispiel erstellt eine In-Memory-Datenbank, fügt einen festen Zeitstempel ein und gibt den konvertierten Wert sowie dessen Typ aus.
Das in sich geschlossene Beispiel konfiguriert die Konvertierung und zeigt, dass die Abfrage den Zeitstempel als Python-datetime-Objekt zurückgibt:
import datetime
import sqlite3
def convert_timestamp(raw_value):
return datetime.datetime.fromisoformat(raw_value.decode("utf-8"))
sqlite3.register_converter("timestamp", convert_timestamp)
connection = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_DECLTYPES)
connection.execute("CREATE TABLE events (created_at TIMESTAMP NOT NULL)")
connection.execute("INSERT INTO events VALUES (?)", ("2024-02-03 04:05:06",))
created_at = connection.execute("SELECT created_at FROM events").fetchone()[0]
print(created_at.isoformat(sep=" "))
print(type(created_at).__name__)
connection.close()
2024-02-03 04:05:06
datetime
Die Konvertierung wird auf Python-Seite für die Verbindung konfiguriert; SQLite selbst speichert den Wert weiterhin nach seinen eigenen Speicherregeln. Wenn kein Konverter registriert oder die Auswertung nicht aktiviert ist, rufen Sie den Wert als Text ab und parsen Sie ihn bei Bedarf im Anwendungscode.
Unix-Zeitstempel in SQLite in Datum und Uhrzeit umwandeln
Übergeben Sie den ganzzahligen Unix-Zeitstempel zusammen mit dem Modifikator unixepoch an die Datums- und Uhrzeitfunktionen von SQLite. Für einen festen Wert liefert datetime(1793956207, 'unixepoch') Datum und Uhrzeit, date(1793956207, 'unixepoch') nur das Datum und time(1793956207, 'unixepoch') die Uhrzeit. Alle drei Ausdrücke verwenden denselben Zeitpunkt und unterscheiden sich nur darin, welchen Teil sie zurückgeben. Ein Ausdruck für die aktuelle Zeit hängt vom Zeitpunkt seiner Auswertung ab. Verwenden Sie daher einen festen Eingabewert, wenn das Beispiel reproduzierbar sein soll.
Datums- und Uhrzeitwerte als Text speichern
Eine Textdarstellung wie 2019-02-02 11:21:08.321 folgt dem Muster YYYY-MM-DD HH:MM:SS.SSS. Dabei handelt es sich um eine Formatierungskonvention, die mit der SQLite-Speicherklasse TEXT gespeichert wird, nicht um einen besonderen Datums- oder Uhrzeittyp. Halten Sie Format, Genauigkeit und Zeitzonenkonvention in allen Zeilen einheitlich. Werte mit einheitlichem Format und den größten Datumsbestandteilen zuerst lassen sich lexikografisch in chronologischer Reihenfolge vergleichen. Werden Formate oder Zeitzonenkonventionen gemischt, können Textvergleiche irreführend sein.