2014-12-26 13 views
5

Ich habe eine Entität mit einer Spalte vom Typ "datetime", um einen Zeitstempel zu speichern.Aktivieren von Mikrosekunden in Symfony2 (Doctrine) und MySQL

/** 
* @ORM\Column(type="datetime") 
*/ 
protected $timestamp; 

Ich hatte MySQL 5.5.40 und ich entdeckte es nicht Mikrosekunden speichert. Also wechselte ich zu 5.6.21 und importierte alle meine Tabellen und Daten.

Ich habe versucht, den Typ als

* @ORM\Column(type="datetime(6)") 

aber es gab mir einen Fehler zu erklären. So habe ich es direkt in der DB, indem Sie:

ALTER TABLE symfony.hrmgmt MODIFY timestamp DATETIME(6); 

In meinem Controller ich dies tun:

$dt = new \DateTime('now'); 
    $newHREvent->setTimestamp($dt); 

Aber dennoch ist der Zeitstempel ohne Fraktionen zweiten gespeicherten .

I (jetzt) ​​manuell Datetime mit Bruchwerten über SQL eingeben, aber wenn ich es durch meinen Controller tue es immer Geschäfte mit 0,000000

nehme ich das ist, weil Lehre nicht weiß, dass es Mikrosekunden auch speichern kann .

Meine PHP-Version ist immer noch 5.4.34.

Vielen Dank!

+0

http://stackoverflow.com/questions/2572209/why-doesnt-mysql-support-millisecond-microsecond-precision –

+2

Ich hatte diesen Post schon gelesen. Die meisten Antworten beziehen sich auf MySQL 5.6 und sind daher nicht relevant. Die Antwort von @Xavier Portebois ist sachdienlich und ich folgte genau der Angabe, DATETIME (6) anstelle von DATETIME zu verwenden. Das Problem (nach meiner Frage) bleibt, wenn ich versuche, Doktrin anstelle von reinem SQL zu verwenden. Dokumentdokumentation lesen Ich habe die "bekannten Probleme des Anbieters" (http://doctrine-dbal.readthedocs.org/en/latest/reference/known-vendor-issues.html) gefunden und es gibt einen Verweis auf Mikrosekundenprobleme in PostgreSQL, aber Es ist nicht für MySQL erwähnt. –

+0

Immer in den "bekannten Vendor Issues" (im PostgreSQL-Bereich) gibt es diesen Kommentar: "Deshalb möchte Doctrine immer die zeitbezogenen Typen ohne Mikrosekunden erstellen ... Wenn Sie Doctrine nicht die Datumsspalte-Typen erstellen lassen und statt Typen mit Mikrosekunden zu verwenden, müssen Sie die Typen "DateTime", "DateTimeTz" und "Time" durch einen liberaleren DateTime-Parser ersetzen, der das Format automatisch erkennt ". Ist das also die Bestätigung, dass Doktrin Mikrosekunden noch nicht unterstützt? Wie soll ich die genannten "liberalen Parser" kodieren? –

Antwort

1

Um einen Datetime mit Mikrosekunde erstellen Sie DateTime::createFromFormat in Ihrem Controller zu verwenden, haben

$date = \DateTime::createFromFormat('U.u', (string)microtime(true)); 
+1

Das Problem liegt nicht in der Erstellung des Objekts auf PHP-Ebene, es ist auf der Doktrinsebene –

+0

Ja, aber Sie verwenden 'new \ DateTime ('jetzt');' so kann es nicht funktionieren, wie es keine Mikrozeit – goto

+0

speichert Das stimmt nicht in PHP 7. – Arthur

Verwandte Themen