Gibt es eine Möglichkeit, Millisekunden aus einem Zeitstempel in MySql
oder PostgreSql
herauszuholen (oder andere nur aus Neugier)?
SELECT CURRENT_TIMESTAMP
--> 2012-03-08 20:12:06.032572
Gibt es so etwas:
SELECT CURRENT_MILLISEC
--> 1331255526000
oder die einzige Alternative ist die DATEDIFF
der era
?
So ermitteln Sie den Unix-Zeitstempel in Sekunden in MySQL:
select UNIX_TIMESTAMP();
Details: http://dev.mysql.com/doc/refman/5.5/de/date-and-time-functions.html#function_unix-timestamp
Nicht getestet PostgreSQL, aber laut dieser Site sollte es funktionieren: http://www.raditha.com/postgres/timestamp.php
select round( date_part( 'Epoch', now() ) );
Für MySQL (5.6+) können Sie Folgendes tun:
SELECT ROUND(UNIX_TIMESTAMP(CURTIME(4)) * 1000)
Welches wird zurückkommen (z. B.):
1420998416685 --milliseconds
In mysql ist es möglich, die uuid-Funktion zum Extrahieren von Millisekunden zu verwenden.
select conv(
concat(
substring(uid,16,3),
substring(uid,10,4),
substring(uid,1,8))
,16,10)
div 10000
- (141427 * 24 * 60 * 60 * 1000) as current_mills
from (select uuid() uid) as alias;
Ergebnis:
+---------------+
| current_mills |
+---------------+
| 1410954031133 |
+---------------+
Es funktioniert auch in älteren MySQL-Versionen!
Vielen Dank für diese Seite: http://rpbouman.blogspot.com.es/2014/06/mysql-extracting-timstamp-and-mac.html
In MySQL 5.7+ können Sie das ausführen
select current_timestamp(6)
für mehr Details
https://dev.mysql.com/doc/refman/5.7/de/fractional-seconds.html
Die korrekte Methode, um Milisekunden von einem Zeitstempelwert in PostgreSQL entsprechend zu aktuelle Dokumentation zu extrahieren, ist:
SELECT date_part('milliseconds', current_timestamp);
--OR
SELECT EXTRACT(MILLISECONDS FROM current_timestamp);
with Returns: Das Sekundenfeld, einschließlich Bruchteilen, multipliziert mit 1000. Beachten Sie, dass dies volle Sekunden einschließt.
Benutzen:
Select curtime(4);
Dies gibt Ihnen Millisekunden.
In PostgreSQL können Sie Folgendes verwenden:
SELECT extract(Epoch from now());
auf MySQL:
SELECT unix_timestamp(now());
Hier ein Ausdruck, der für MariaDB und MySQL> = 5.6 funktioniert:
SELECT (UNIX_TIMESTAMP(NOW()) * 1000000 + MICROSECOND(NOW(6))) AS unix_now_in_microseconds;
Dies beruht auf der Tatsache, dass NOW () immer die gleiche Zeit in einer Abfrage zurückgibt ; Es ist möglich, dass eine einfache UNIX_TIMESTAMP()
auch funktionieren würde, ich bin mir nicht sicher basierend auf der Dokumentation . Es erfordert außerdem MySQL> = 5.6 für das neue Präzisionsargument für die Funktion NOW()
(MariaDB funktioniert auch).
Keine dieser Antworten löst das Problem in postgreSQL, d. H.
abrufen des Unix-Zeitstempels eines Datumsfeldes in Millisekunden
Ich hatte das gleiche Problem und testete die verschiedenen vorherigen Antworten ohne zufriedenstellendes Ergebnis.
Schließlich habe ich einen wirklich einfachen Weg gefunden, wahrscheinlich den einfachsten:
SELECT (EXTRACT (Epoch FROM <date_column>::timestamp)::float*1000 as unix_tms
FROM <table>
nämlich:
Das größte Missverständnis in MySQL mit Zeitstempeln ist, dass MySQL standardmäßig Zeitstempel zurückgibt und speichert, ohne einen Bruchteil .
SELECT current_timestamp() => 2018-01-18 12:05:34
die als Sekundenstempel umgewandelt werden kann
SELECT UNIX_TIMESTAMP(current_timestamp()) => 1516272429
Bruchteil hinzufügen:
SELECT current_timestamp(3) => 2018-01-18 12:05:58.983
die als Mikrosekunden-Zeitstempel konvertiert werden kann
SELECT CAST( 1000*UNIX_TIMESTAMP(current_timestamp(3)) AS UNSIGNED INTEGER) ts => 1516272274786
Es gibt wenige Tricks beim Speichern in Tabellen. Wenn dein Tisch so erstellt wurde
CREATE TABLE `ts_test_table` (
`id` int(1) NOT NULL,
`not_fractional_timestamp` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
als MySQL wird keinen Bruchteil darin speichern:
id, not_fractional_timestamp
1, 2018-01-18 11:35:12
Wenn Sie einen Bruchteil in Ihre Tabelle einfügen möchten, müssen Sie die Tabelle auf andere Weise erstellen:
CREATE TABLE `ts_test_table2` (
`id` int(1) NOT NULL,
`some_data` varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL,
`fractional_timestamp` timestamp(3) NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
das führt zum gewünschten Ergebnis:
id, some_data, fractional_timestamp
1, 8, 2018-01-18 11:45:40.811
die current_timestamp () - Funktion darf Werte bis zu 6 erhalten, aber ich habe herausgefunden (zumindest in meiner installierten MySQL 5.7.11-Version unter Windows), dass die Bruchgenauigkeit 6 zu einem konstanten Wert von 3 Stellen am Ende führt. in meinem Fall 688
id, some_data, fractional_timestamp
1, 2, 2018-01-18 12:01:54.167688
2, 4, 2018-01-18 12:01:58.893688
Das bedeutet, dass die wirklich nutzbare Zeitstempelgenauigkeit von MySQL plattformabhängig ist:
Am einfachsten fand ich die aktuelle Zeit in Millisekunden in MySql:
SELECT (UNIX_TIMESTAMP(NOW(3)) * 1000)
Seit MySql 5.6.
Ich hatte das Bedürfnis, mich weiter zu verfeinern, also in MySQL:
Aktueller Zeitstempel in Millisekunden:
floor(unix_timestamp(current_timestamp(3)) * 1000)
Zeitstempel in Millisekunden von der angegebenen Datumszeit (3):
floor(unix_timestamp("2015-04-27 15:14:55.692") * 1000)
Zeitstempel in Millisekunden nach Datum (3) umrechnen:
from_unixtime(1430146422456 / 1000)
Datumszeit (3) in Zeitstempel in Millisekunden umrechnen:
floor(unix_timestamp("2015-04-27 14:53:42.456") * 1000)
In PostgreSQL verwenden wir diesen Ansatz:
SELECT round(EXTRACT (Epoch FROM now())::float*1000)
Für Millisekunden wie folgt vorgehen:
select round(date_format(CURTIME(3), "%f")/1000)
Sie können Mikrosekunden wie folgt erhalten:
select date_format(CURTIME(6), "%f")
Ich war kürzlich mit demselben Problem konfrontiert und habe ein kleines Github-Projekt erstellt, das eine neue Mysql-Funktion UNIX_TIMESTAMP_MS()
enthält, die den aktuellen Zeitstempel in Millisekunden zurückgibt.
Sie können auch Folgendes tun:
SELECT UNIX_TIMESTAMP_MS(NOW(3))
oder SELECT UNIX_TIMESTAMP_MS(DateTimeField)
Das Projekt befindet sich hier: https://github.com/silviucpp/unix_timestamp_ms
Zum Kompilieren müssen Sie einfach make compile
im Projektstamm ausführen.
Dann müssen Sie nur die gemeinsam genutzte Bibliothek in /usr/lib/mysql/plugin/
kopieren (oder was auch immer der Plugin-Ordner auf Ihrem Computer ist.)
Danach einfach eine mysql-Konsole öffnen und ausführen:
CREATE FUNCTION UNIX_TIMESTAMP_MS RETURNS INT SONAME 'unix_timestamp_ms.so';
Ich hoffe, das wird helfen, Silviu