HOWTO · SQLite
Konvertieren Sie String-Datum mit Format in SQLite
In diesem Tutorial wird erläutert, wie Sie Zeichenfolgedaten mit Format in SQLite konvertieren.
Auf dieser Seite
SQLite hat keinen eigenen Datumsdatentyp zur Speicherung. Anwendungen speichern Datumswerte üblicherweise als Text, julianische Tageszahlen oder Unix-Zeitstempel. Die Datums- und Zeitfunktionen von SQLite interpretieren unterstützte Zeitwerte; sie erkennen nicht automatisch jede Zeichenfolge, die wie ein Datum aussieht. Um eine Datumszeichenfolge zu formatieren, muss sie zunächst einem Eingabeformat entsprechen, das SQLite erkennt. Anschließend wählen Sie das gewünschte Ausgabeformat.
Die folgenden Beispiele verwenden SQLite-SQL. strftime() formatiert einen erkannten Zeitwert als Text; der gespeicherte Tabellenwert wird dadurch nicht dauerhaft geändert. Wenn die Quelle ein eigenes Format wie MM-DD-YYYY verwendet, wandeln Sie den Wert ausdrücklich um, bevor Sie sich auf Datumsvergleiche oder Berechnungen stützen.
Wie SQLite Datums- und Zeitwerte interpretiert
Die Datums- und Zeitfunktionen von SQLite akzeptieren unterstützte Zeitwerte, darunter gängige ISO-8601-Textformate, julianische Tageszahlen und Unix-Zeitstempel, sofern der passende Modifikator verwendet wird. Eine Textspalte kann beliebige Zeichen enthalten. Ein Wert in einer Spalte namens event_date ist daher nicht automatisch ein Wert, den SQLite interpretieren kann. Wenn Sie die Datenquelle kontrollieren, verwenden Sie ein einheitliches Eingabeformat.
Formatierung und Parsing hängen zusammen, sind aber unterschiedliche Vorgänge. strftime() erhält eine Formatzeichenfolge und danach einen Zeitwert. Wenn SQLite den Wert versteht, gibt die Funktion formatierten Text zurück. Kann SQLite die Eingabe nicht interpretieren, ist das Ergebnis NULL. Prüfen Sie dieses Ergebnis ausdrücklich, statt anzunehmen, dass jede Zeile umgewandelt wurde.
Eine unterstützte Datumszeichenfolge mit strftime() formatieren
Verwenden Sie als Eingabe ein unterstütztes ISO-Datum und als Ausgabeformat %Y-%m-%d. %Y steht für ein vierstelliges Jahr, %m für einen zweistelligen Monat und %d für einen zweistelligen Tag. Das Ausgabeformat legt auch die Satzzeichen fest; in diesem Beispiel werden durchgehend Bindestriche verwendet.
Führen Sie das eigenständige Python-Beispiel aus. Es übergibt die SQL-Abfrage an SQLite und gibt den zurückgegebenen Wert aus.
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
import sqlite3
connection = sqlite3.connect(":memory:")
value = connection.execute(
"SELECT strftime('%Y-%m-%d', '2022-12-31')"
).fetchone()[0]
print(value)
connection.close()
2022-12-31
Der entsprechende SQL-Ausdruck lautet SELECT strftime('%Y-%m-%d', '2022-12-31');. In einer Abfrage ist das Ergebnis Text, was sich für die Anzeige und den Export eignet. Verwenden Sie für chronologische Vergleiche ein einheitliches, sortierbares Format wie YYYY-MM-DD, oder vergleichen Sie Werte mit den Datums- und Zeitfunktionen von SQLite, statt unterschiedliche Textformate zu vermischen.
Datumswerte aus einer Tabelle formatieren
Wenden Sie dieselbe Funktion auf eine Spalte an, wenn deren Werte ein unterstütztes Eingabeformat haben. Angenommen, events enthält die Eingabezeile event_date = '2022-12-31'. Diese SQLite-Abfrage formatiert den Wert als Tag/Monat/Jahr: SELECT event_date, strftime('%d/%m/%Y', event_date) AS formatted_date FROM events;. Die zugehörige Ergebniszeile lautet 2022-12-31 | 31/12/2022. Die Abfrage gibt pro Zeile einen formatierten Wert zurück, ändert aber die gespeicherte Spalte nicht. Verwenden Sie UPDATE nur, wenn Sie gespeicherte Daten ausdrücklich ersetzen möchten, und erstellen Sie vorher eine Sicherung.
Die Annahme zum Eingabeformat ist wichtig. Enthält eine Zeile ein anderes Format oder nicht zusammenhängenden Text, kann die Formatierung für diese Zeile NULL zurückgeben. Wählen Sie bei der Datenbereinigung sowohl die ursprüngliche Spalte als auch das formatierte Ergebnis aus. So erkennen Sie Werte, die vor einer Änderung oder einem Export gesondert behandelt werden müssen.
Mehrere Eingabeformate sicher behandeln
Wenn eine Spalte Werte in mehreren Formaten enthält, bestimmen Sie jedes Format anhand einer verlässlichen Regel, etwa des Importtyps oder einer separaten Spalte source_format. Leiten Sie die Datumsdarstellung nicht allein aus einem Schrägstrich oder Bindestrich ab: 03/04/2024 kann den 4. März oder den 3. April bedeuten. Auch durch das Ersetzen von Trennzeichen werden Jahr, Monat und Tag nicht neu angeordnet.
Wenn die Quellregel für eine Zeile MM-DD-YYYY vorgibt, kann SQLite die Bestandteile vor der Formatierung zu einem unterstützten ISO-Datum zusammensetzen. Für event_date = '12-31-2022' und source_format = 'MM-DD-YYYY' verwenden Sie beispielsweise CASE WHEN source_format = 'MM-DD-YYYY' THEN strftime('%Y-%m-%d', substr(event_date, 7, 4) || '-' || substr(event_date, 1, 2) || '-' || substr(event_date, 4, 2)) WHEN source_format = 'YYYY-MM-DD' THEN strftime('%Y-%m-%d', event_date) ELSE NULL END AS normalized_date. Der erste Zweig gibt 2022-12-31 zurück. Bei einer nicht erkannten Angabe in source_format wird NULL zurückgegeben, statt den Wert als umgewandelt auszugeben. Eine Prüfung der Zeichenform kann helfen, Zeilen dem passenden Zweig zuzuordnen. Übereinstimmende Zeichenpositionen belegen jedoch nicht, dass Monat und Tag ein gültiges Kalenderdatum bilden. Prüfen Sie Kalenderdaten separat, wenn Sie nicht vertrauenswürdige Werte importieren.
Ergebnisse prüfen und nicht erkannte Werte behandeln
Prüfen Sie, ob der zurückgegebene Wert NULL ist, und behalten Sie den ursprünglichen Wert während der Untersuchung bei. Ein Ergebnis von NULL bedeutet, dass die Datumsfunktion keinen formatierten Wert erzeugt hat. Es ist kein Ersatzdatum und darf nicht stillschweigend als solches behandelt werden. Prüfen Sie Leerzeichen, die genaue Reihenfolge von Jahr, Monat und Tag sowie, ob ein Zeitstempel einen Zusatz enthält, den Ihre Umwandlung nicht berücksichtigt.
Wenn die Werte aus einer externen Datenquelle stammen, vereinheitlichen Sie sie beim Einlesen und halten Sie fest, welches Quellformat verwendet wurde. Lässt sich das Format einer Zeile nicht sicher bestimmen, lassen Sie sie für die Datenbereinigung offen, statt zu raten. strftime() eignet sich auch für andere Anzeigereihenfolgen als ISO. Eine Änderung des Ausgabeformats ändert aber nur den zurückgegebenen Text, nicht die gespeicherte Darstellung. Diese Beispiele beziehen sich auf SQLite; andere Datenbanksysteme verwenden andere Datumsfunktionen und Parsing-Regeln.