2014-10-10 13 views
37

Ich muss eine Anwendung mit MySQL entwickeln und ich muss Werte wie "1412792828893" speichern, die einen Zeitstempel darstellen, aber mit einer Genauigkeit von einer Millisekunde. Das ist die Anzahl der Millisekunden seit dem 1.1.1970. Ich erkläre die Zeile als timestamp, aber das hat leider nicht funktioniert. Alle Werte werden auf 0000-00-00 00:00:00Zeitstempel mit einer Genauigkeit von Millisekunden: Wie man sie in MySQL speichert

CREATE TABLE IF NOT EXISTS `probability` (
`id` int(11) NOT NULL AUTO_INCREMENT, 
`segment_id` int(11) NOT NULL, 
`probability` float NOT NULL, 
`measured_at` timestamp NOT NULL, 
`provider_id` int(11) NOT NULL, 
PRIMARY KEY (`id`) 
) ; 

Wie soll die Erklärung sein, um in der Lage sein Zeitmarkenwerte mit dieser Genauigkeit zu sparen?

+0

verwenden Welche Version von MySQL? – Strawberry

+0

mysql Ver 14.14 Distrib 5.6.11, für Win32 (x86) – Luixv

+0

Sieht aus, als ob Sie Glück haben. – Strawberry

Antwort

62

Sie müssen bei MySQL Version 5.6.4 oder höher sein, um Spalten mit Sekundenbruchteil-Datentypen zu deklarieren. Nicht sicher, dass Sie die richtige Version haben? Versuchen Sie SELECT NOW(3). Wenn Sie einen Fehler erhalten, haben Sie nicht die richtige Version.

Zum Beispiel gibt DATETIME(3) Ihnen Millisekunde Auflösung in Ihren Zeitstempeln, und TIMESTAMP(6) wird Ihnen Mikrosekundenauflösung auf einem * nix-style Zeitstempel geben.

dies lesen: http://dev.mysql.com/doc/refman/5.7/en/fractional-seconds.html

NOW(3) geben Ihnen die aktuelle Zeit von Ihrem MySQL Server-Betriebssystem mit Millisekunden-Präzision.

Wenn Sie eine Anzahl von Millisekunden seit Beginn der Unix epoch haben, versuchen Sie dies ein DATETIME- (3) Wert

FROM_UNIXTIME(ms * 0.001) 

Javascript timestamps, zum Beispiel zu bekommen, werden in Millisekunden seit dem Unix epoch vertreten.

(Beachten Sie, dass MySQL interne Bruchrechnung, wie * 0.001, immer als IEEE754 double precision floating point behandelt wird, so dass es unwahrscheinlich ist, Sie Präzision verlieren werden, bevor die Sonne ein weißer Zwergstern wird.)

Wenn Sie‘ Wenn Sie eine ältere Version von MySQL verwenden und Sie benötigen Zeit im Sekundentakt, ist Ihr bester Weg das Upgrade. Alles andere wird Sie dazu zwingen, unordentliche Problemumgehungen zu machen.

Wenn Sie aus irgendeinem Grund nicht upgraden können, können Sie die Spalten BIGINT oder DOUBLE verwenden, um Javascript-Zeitstempel wie Zahlen zu speichern. FROM_UNIXTIME(col * 0.001) funktioniert immer noch OK. Wenn Sie die aktuelle Zeit benötigen, um in einer solchen Spalte zu speichern, könnten Sie UNIX_TIMESTAMP() * 1000

+0

Ich habe meine Definition in timestamp (6) geändert, aber beim Versuch, Werte mit dieser Syntax hinzuzufügen INSERT INTO-Wahrscheinlichkeit (measured_at, probability, provider_id, segment_id) VALUES (1412877161519,0,7418073347680607,1,211623); Ich bekomme immer noch 00: 00: 00.00000 in der Spalte "Measured_at". Wie sollte ich Werte in diese Tabelle einfügen? – Luixv

+1

@ Luixv müssten Sie den Wert auf dem Weg in konvertieren: 'INSERT ... VALUES (FROM_UNIXTIME (0.001 * 1412877161519), 0.7418 ...);' –

+0

Multiplizieren mit 0,001 ist ein Lebensretter! Ich konnte mir nie vorstellen, dass es funktionieren würde, ohne den zweiten Teil zu verlieren. Vielen Dank. –

Verwandte Themen