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:
- In Allgemein, wie funktioniert MySQL Datetime-Felder gegeneinander (man denke an die obige Abfrage) vergleichen.
- Ist die obige Abfrage in Ordnung, und nutzt sie Indizes für die Zeit Felder? (MySQL < 5.6.4)
- Gibt es eine Möglichkeit, Millisekunden auszuschließen? I.e. beim Einfügen und in bedingte Joins/wählt usw.? (MySQL> 5.6.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?
gut für Ihre dritte Frage zu diesem Datum verwenden (time_column) wird dies tun, den Trick –
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) –
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 –