2012-06-21 3 views
8

i Tabellen haben zwei wie so Angenommen:MySQL Join/Vergleich auf einer DATETIME- Säule (<5.6.4 and > 5.6.4)

Events 
ID (PK int autoInc), Time (datetime), Caption (varchar) 

Position 
ID (PK int autoinc), Time (datetime), Easting (float), Northing (float) 

Ist es sicher zu sein, zum Beispiel eine Liste aller Ereignisse und ihre Position, wenn ich bin Verwenden Sie das Feld Time als mein Beitrittskriterium? D.h .:

SELECT E.*,P.* FROM Events E JOIN Position P ON E.Time = P.Time 

OR, sogar den Vergleich einfach nur einen Datetime-Wert (unter Berücksichtigung, dass der parametrierte Wert des Sekundenbruchteil enthalten können - die MySQL immer akzeptiert hat), z.B.

SELECT E.* FROM Events E WHERE E.Time = @Time 

ich MySQL verstehen (vor Version 5.6.4) speichert nur Datetime-Felder ohne Millisekunden. Ich würde also annehmen, dass diese Abfrage in Ordnung wäre. Ab Version 5.6.4 habe ich gelesen, dass MySQL jetzt Millisekunden mit dem Datetime-Feld speichern kann.

Angenommen, dass Datetime-Werte mit Funktionen wie NOW() eingefügt werden, werden die Millisekunden abgeschnitten (< 5.6.4), was ich annehmen würde, dass die obige Abfrage funktioniert. Mit Version 5.6.4 und höher könnte dies jedoch möglicherweise NICHT funktionieren. Ich bin und werde mich nur für die zweite Genauigkeit interessieren.

Wenn jemand folgende Fragen sehr geschätzt würde antworten konnte:

  1. In Allgemein, wie funktioniert MySQL Datetime-Felder gegeneinander (man denke an die obige Abfrage) vergleichen.
  2. Ist die obige Abfrage in Ordnung, und nutzt sie Indizes für die Zeit Felder? (MySQL < 5.6.4)
  3. Gibt es eine Möglichkeit, Millisekunden auszuschließen? I.e. beim Einfügen und in bedingte Joins/wählt usw.? (MySQL> 5.6.4)
  4. Funktioniert die Join-Abfrage oben? (MySQL> 5.6.4)

EDIT

Ich weiß, dass ich die Datetimes werfen können, Dank für diejenigen, die beantwortet, aber ich versuche, die Wurzel des zu bekämpfen Problem hier (die Tatsache, dass der Lagertyp/Definition wurde geändert) und ich möchte nicht Funktionen in meinen Abfragen verwenden. Dies negiert meine ganze Arbeit der Optimierung von Abfragen, die Indizes usw. anwenden, ganz zu schweigen davon, dass ich alle meine Abfragen neu schreiben muss.

EDIT2

Kann jemand da draußen einen Grund vorschlägt, nicht auf ein DATETIME Feld mit zweiter Genauigkeit zu verbinden?

+0

gut für Ihre dritte Frage zu diesem Datum verwenden (time_column) wird dies tun, den Trick –

+1

I 'NOW()' in 5.6.4 oder später nicht mehr berücksichtigt Millisekunden glauben, es sei denn, Sie passieren in einem Parameter (0-6), der die "* Sekundenbruchteil-Genauigkeit *" angibt, sollten Sie also für den Joining in Ordnung sein, solange Sie Parameter nicht an 'NOW()' More [hier] übergeben (http://dev.mysql.com/doc/refman/5.6/en/date-and-time-functions.html#function_now) –

+0

Welche Zeitzone wird für die DATETIME verwendet, die Zeitzone hat "Sprünge" wie http: // stackoverflow .com/questions/6841333/why-is-subtrahieren-diese-zwei-mal-in-1927-geben-ein-seltsames-ergebnis –

Antwort

4

Es scheint, dass MySQL-Entwickler nicht die Abwärtskompatibilität brechen wollte, so Millisekunden zu verwenden, müssen Sie explizit die Tabellen, SQL, etc. ändern diese Funktion zu nutzen:

http://dev.mysql.com/doc/refman/5.6/en/date-and-time-functions.html#function_now

NOW ([fsp])

Ab MySQL 5.6.4, wenn das fsp Argument verwendet wird, um anzugeben, ein Sekundenbruchteil-Genauigkeit von 0 bis 6, der Rückgabewert enthält einen Teil der Anzahl der Dezimalstellen von Sekunden. Vor dem 5.6.4 wird ein beliebiges Argument ignoriert.

http://dev.mysql.com/doc/refman/5.6/en/fractional-seconds.html

MySQL 5.6.4 und höher erweitert fraktionierte Sekunden Unterstützung für TIME, DATETIME-, und Zeitstempelwerte mit bis zu Mikrosekunden (6-stellig) precision:

zu definieren Verwenden Sie die Syntax type_name (fsp), wobei type_name für TIME, DATETIME oder TIMESTAMP steht, und fsp für die Genauigkeit der Sekundenbruchteile. Zum Beispiel:

CREATE TABLE t1 (t TIME(3), dt DATETIME(6)); The fsp value, if given, must be in the range 0 to 6. A value of 0 signifies that there is no fractional part. If omitted, the default precision is 0. (This differs from the standard SQL default of 6, for compatibility with previous MySQL versions.) 
+0

+1 danke biziclop. Das sind gute Nachrichten, ich sollte nichts ändern müssen. – Simon

+0

Ich erweiterte Zane Bien's Kommentar :) – biziclop

1

Versuchen Sie diese Abfrage. Für Frage 3 und 4 wird das gut funktionieren.Dennoch ist es keine gute Praxis Zeit Feld für die

SELECT E.*,P.* FROM Events E JOIN Position P ON date(E.Time) = date(P.Time) 

verbindet Obwohl ich Ihnen eine Lösung gegeben haben, aber Sie werden zur gleichen Zeit in verschiedenen Tabellen einfügen eingeschränkt werden. Dann können Sie vergleichen, aber es ist ziemlich schwierig, weil Sie gleichzeitig zwei Insert-Abfragen ausführen können. Sie müssen also einige Menüarbeit dafür tun. Wenn Sie mehr lesen möchten, lesen Sie diesen Artikel.

http://billauer.co.il/blog/2009/03/mysql-datetime-epoch-unix-time/

+0

Könnten Sie bitte erklären, WARUM es nicht ratsam ist, das Zeitfeld für einen Join zu verwenden. Danke – Simon

+0

Ich habe diesen Blogpost gesehen, und während es Diskussion über die Verwendung von 'DATETIME' oder' INT' als Zeitspeicher einlädt, behandelt es nicht wirklich die Probleme der Genauigkeit beim Vergleich 'DATETIME' Werte. Verwenden eines 'JOIN'- oder einfachen Gleichheitsvergleichs. – Simon

+0

Einfaches Beispiel, bei dem das Verbinden mit einer 'DATETIME'-Spalte fehlschlagen kann: Da beide Einfügungen nicht gleichzeitig stattfinden können, kann es eine (kleine) Verzögerung zwischen ihnen geben. Angenommen, die erste Einfügung befindet sich bei 19: 59: 59,999 (die Millisekunden), die auf 19:59:59 verkürzt werden kann, und die zweite Einfügung ist nur 1 ms später bei 20: 00: 00.000, was auf 20:00 verkürzt : 00. Jetzt viel Glück mit Ihrem Beitritt. Dies unter der Annahme, dass Sie 'NOW()' tatsächlich in Ihren Insert-Abfragen verwenden, und nicht für einige vorberechnete Zeitwerte, die für beide Abfragen gleich sind. – Bart

Verwandte Themen