SQL-Unix-Timestamp-Snippets
SQL-Beispiele für die Arbeit mit Unix-Timestamps in MySQL, PostgreSQL und SQLite, einschließlich aktueller Epoch-Werte, Umwandlung in Daten und Rückumwandlung in Timestamps.
-- Seconds
UNIX_TIMESTAMP()
-- Milliseconds (MySQL 8.0+)
ROUND(UNIX_TIMESTAMP(NOW(3)) * 1000)FROM_UNIXTIME(1700000000)
FROM_UNIXTIME(1700000000, '%Y-%m-%d %H:%i:%S')UNIX_TIMESTAMP('2023-11-15 06:13:20')-- Seconds (integer)
EXTRACT(EPOCH FROM NOW())::BIGINT
-- Milliseconds
ROUND(EXTRACT(EPOCH FROM NOW()) * 1000)::BIGINTTO_TIMESTAMP(1700000000)
TO_TIMESTAMP(1700000000) AT TIME ZONE 'America/New_York'EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE '2023-11-15T06:13:20Z')::BIGINTstrftime('%s', 'now') -- secondsdatetime(1700000000, 'unixepoch')
datetime(1700000000, 'unixepoch', 'localtime')Grundlagen zu SQL-Zeitstempeln
Jede Datenbank bietet Unix-Zeitstempel-Helfer mit leicht unterschiedlichen Namen. MySQL verwendet UNIX_TIMESTAMP(), PostgreSQL kann Epoch-Sekunden aus now() extrahieren und SQLite verwendet üblicherweise strftime('%s', 'now').
Hinweise zur Datenbankumwandlung
Speichere Zeitstempel als Ganzzahlen, wenn du schnelle numerische Vergleiche brauchst, oder verwende native Zeitstempeltypen, wenn du datenbankseitige Zeitzonen- und Datumsfunktionen brauchst. Sei an Import- und Exportgrenzen explizit über UTC.
Hinweise für den Produktiveinsatz von SQL
Die Wahl des Datenbank-Zeitstempels sollte dazu passen, wie der Wert abgefragt wird. Ganzzahlige Unix-Sekunden sind einfach für Log-Fenster und Bereichsscans. Native Zeitstempeltypen sind besser, wenn die Datenbank nach Kalendertag gruppieren, auf den Monat kürzen oder zeitzonenbewusste Funktionen anwenden muss. Vermeide das Mischen beider Darstellungen ohne klare Umwandlungsregel.
- Verwende BIGINT statt INT zum Speichern von Millisekunden-Zeitstempeln
- Verwende UTC für importierte Zeitstempel, damit sich Anwendungsserver über Grenzen einig sind
- Verwende halboffene Bereiche wie created_at >= start and created_at < end
- Indexiere genau die Spalte, die in Bereichsfiltern verwendet wird, ob Epoch-Sekunden oder ein Zeitstempeltyp
Datetime-Umwandlung in SQL: GETDATE, CONVERT, CAST
SQL-Server-Nutzer, die nach „datetime convert in sql“, „getdate sql“, „sql conversion date“, „sql getdate date“ oder „convert date timestamp to date“ suchen, wollen meist die T-SQL-Helfer GETDATE(), CONVERT() und CAST(). MySQL und PostgreSQL verwenden andere Built-ins, aber die Operation ist dieselbe: eine Unix-Ganzzahl in ein datetime umwandeln oder ein datetime in die passende Unix-Ganzzahl.
- SQL Server GETDATE() — aktuelles datetime in der lokalen Serverzone; verwende SYSUTCDATETIME() für UTC
- SQL Server epoch → datetime: DATEADD(SECOND, 1700000000, '1970-01-01T00:00:00')
- SQL Server datetime → epoch: DATEDIFF_BIG(SECOND, '1970-01-01', GETUTCDATE())
- SQL Server CONVERT/CAST date↔datetime: CONVERT(date, GETDATE()) entfernt die Zeit; CAST('2024-03-15T14:30:00' AS datetime2) parst ISO 8601
- MySQL: SELECT UNIX_TIMESTAMP(NOW()); aktuelle Epoche; FROM_UNIXTIME(1700000000) für die Gegenrichtung
- PostgreSQL: SELECT EXTRACT(EPOCH FROM now()); aktuelle Epoche; to_timestamp(1700000000) für die Gegenrichtung
- SQLite: SELECT strftime('%s','now'); aktuelle Epoche; datetime(1700000000, 'unixepoch') für die Gegenrichtung
- SQL CAST AS DATE / sql cast as date — CAST(GETDATE() AS date) entfernt den Zeitanteil und gibt nur YYYY-MM-DD zurück
- SQL CAST datetime to date / sql cast datetime to date — CAST(your_datetime AS date) behält nur das Kalenderdatum
- SQL CONVERT datetime / sql convert datetime — CONVERT(varchar, GETDATE(), 120) gibt "YYYY-MM-DD HH:MI:SS" zurück; Stil 126 gibt ISO 8601 zurück
- SQL format date convert / sql format date convert — SQL Server: FORMAT(GETDATE(), 'yyyy-MM-dd HH:mm:ss') für eigenes Layout oder CONVERT(varchar, GETDATE(), 126) für ISO 8601
- SQL CAST AS integer / sql cast as integer — CAST(value AS int) — nützlich für Epoch-Werte in numerischen Spalten
- SQL convert from datetime to date / sql convert from datetime to date — CAST(dt AS date) oder CONVERT(date, dt) entfernt den Zeitanteil
- SQL convert integer / sql convert integer — CAST(value AS bigint) für 13-stellige ms-Zeitstempel, die INT überschreiten
- SQL datetime to date / sql datetime to date — CAST(your_datetime AS date) gibt nur YYYY-MM-DD zurück
FAQ
- Sollten Epoch-Millisekunden in INT gespeichert werden?
- Nein. Moderne Millisekunden-Zeitstempel sind 13-stellig und passen nicht sicher in ein 32-Bit-INT. Verwende BIGINT oder einen nativen Zeitstempeltyp.
- Sind Datenbank-Zeitstempel immer UTC?
- Nein. Das Verhalten hängt vom Datenbanktyp und der Sitzungszeitzone ab. Sei beim Importieren, Exportieren und Vergleichen von Werten über Systeme hinweg explizit bei UTC.