2010-01-29 5 views
5

Aus Gründen, die zu unklar sind, um zu bekommen, habe ich eine Millisekunde Darstellung einer bestimmten Zeit und ich habe eine MySQL-Datenbank mit mySql Timestamps gefüllt und ich bin neugierig, wenn es möglich ist, nur native Vergleiche in SQL wie select * from myTable where time_stamp_column > 1264665600000; oder etwas in dieser Richtung.ist es möglich, eine mysql TIMESTAMP zu einer Millisekunde zu vergleichen?

Ich habe einige Tests durchgeführt und die Ergebnisse sind ziemlich seltsam. Es beschwert sich nicht, gibt aber eine Zeile zurück, die nicht den Kriterien entspricht.

Vielen Dank im Voraus.

[EDIT] Ok, wenn die Verwendung von Millisekunden in mySQL ist ein Non-Starter, was ist der beste Weg, um die Daten zu vergleichen, vorausgesetzt, ich bin in Millis und bin in Java gestartet.

Antwort

6

Sie erhalten keine Millisekunden-Genauigkeit, aber nach den Nullen am Ende Ihres Beispiels zu urteilen, brauchen Sie es möglicherweise nicht.

Verwenden Sie FROM_UNIXTIME, um einen Unix-Zeitstempel in ein MySQL-TIMESTAMP zu konvertieren. Es sieht aus wie Sie Millisekunden seit Unix Epoche haben, so sie nur durch 1000 teilen zu konvertieren:

SELECT * FROM myTable WHERE time_stamp_column > FROM_UNIXTIME(1264665600000/1000); 

Sie müssen für Zeitzone/DST Probleme hier einstellen können, da die SQL-Zeitstempel sind, äußerst deprimierend, Ortszeit.

+0

nein nein ... du hast Recht, ich interessiere mich überhaupt nicht für Millisekunden-Genauigkeit, ich kann sogar die Zahl bereits um 3 Größenordnungen reduziert übergeben ... Ich denke, das wird funktionieren. –

3

Anscheinend ist dies ein bekannter Fehler: Bug 8523. Siehe Once upon a timestamp(milliseconds)...

In den Fairness willen, hat MySQL in die Tat einen Weg geliefert zu behalten Milliohm und Mikrosekunden in einem Dezimalfeld DECIMAL(17,3), und es ist auch abfragbaren, als ob es ein Zeitstempel war aber warum isn‘ t es möglich, in ein oder TIMESTAMP Feld zu speichern?

3

Nein, TIMESTAMP- und DATETIME-Spalten speichern leider keine Werte im Millisekundenbereich. Ein Workaround hierfür ist die Verwendung einer BIGINT-Spalte, und Sie haben Ihre Zeitstempel mit der entsprechenden Anzahl von Millisekunden-Stellen, d. 1264808431000. Leider bedeutet dies, dass eine Vergleichslogik in Ihrer Anwendung oder in MySQL auf BIGINT-Basis erstellt werden muss.

+2

finde ich das nicht ein Nachteil überhaupt, persönlich. Integer sind über Datenbanken und Datenzugriffsebenen hinweg viel einfacher und einheitlicher als das Chaos von Datumstypen. Es mag nicht ideologisch rein sein, aber es gibt keinen praktischen Nachteil; es ist jedesmal INT/BIGINT Zeitstempel für mich. – bobince

+0

@bobince - Ich finde es manchmal etwas unhandlich, und es macht es schwieriger, einige der RDBMS-spezifischen Datumsfunktionen zu verwenden. Andererseits können Sie mit INTs manchmal ein oder zwei Byte auf einem Datensatz speichern. Es ist eine ziemlich kontextuelle Entscheidung. – zombat

+0

Ja, ich mache das nicht für Speichereinsparungen, ich mache es für Vorhersagbarkeit: Ich muss mir keine Gedanken über Datumsformate und Zeitzonen machen, was ich als Teil des UI-Layers betrachte und nichts, was ich in der Nähe meines Backend-Datenspeichers haben möchte .Ich halte es für wirklich albern, meinen Zeitstempel in eine Zeichenkette umzuwandeln, nur damit MySQL sie in einen Zeitstempel für den Speicher zurückverwandeln kann (nur mit einer vermummten lokalen Zeitzone). – bobince

Verwandte Themen