2014-12-26 15 views
5

Mam encję z jedną kolumną typu "datetime" do przechowywania znacznika czasu.Włączanie mikrosekund w Symfony2 (Doctrine) i MySQL

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

miałem MySQL 5.5.40 i odkryłem, że nie przechowuje mikrosekund. Więc przełączyłem się na 5.6.21 i zaimportowałem wszystkie moje tabele i dane.

Próbowałem zadeklarować typ jak

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

ale dał mi błąd. Więc zmieniłem go bezpośrednio w PB robi:

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

W moim kontrolera I to zrobić:

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

niemniej datownik jest przechowywany bez ułamków sekundy .

mogę (teraz) ręcznie wprowadzić datetime o wartościach ułamkowych poprzez SQL, ale kiedy to zrobić za pośrednictwem mojego kontrolera zawsze sklepów z .000000

Przypuszczam, że to dlatego, że doktryna nie wie, że można go przechowywać również mikrosekund .

Moja wersja PHP nadal 5.4.34.

Dziękujemy!

+0

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

+2

Przeczytałem już ten post. Większość odpowiedzi odnosi się do wcześniejszych wersji MySQL 5.6, a więc nieistotnych. Odpowiedź z @Xavier Portebois jest trafna i precyzyjnie podążałem za wskazówką, by użyć DATETIME (6) zamiast DATETIME. Problem (jak na moje pytanie) pozostaje, jeśli spróbuję użyć doktryny zamiast czystego SQL. Czytanie dokumentacji Doctrine Znalazłem "znane problemy z dostawcami" (http://doctrine-dbal.readthedocs.org/en/latest/reference/known-vendor-issues.html) i jest tam odniesienie do problemów z mikrosekundami w PostgreSQL, ale to nie jest wspomniane dla MySQL. –

+0

Zawsze w "znanych problemach z dostawcą" (w sekcji PostgreSQL) znajduje się następujący komentarz: "Właśnie dlatego Doctrine zawsze chce tworzyć typy związane z czasem bez mikrosekund ... Jeśli nie pozwolisz Doctrine utworzyć typów kolumn daty i raczej używaj typów z mikrosekundami, które zastąpiły typy "DateTime", "DateTimeTz" i "Time" z bardziej liberalnym parserem DateTime, który automatycznie wykrywa format ". Czy to jest potwierdzenie, że Doctrine wciąż nie obsługuje mikrosekund? Jak mam opisać "parsery liberalne"? –

Odpowiedz

1

Aby utworzyć datetime z mikrosekundy trzeba użyć DateTime::createFromFormat w kontrolerze

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

Problem nie polega na tworzeniu obiektu na poziomie php, jest na poziomie doktryny –

+0

Tak, ale używasz 'new \ DateTime ('teraz') ;, więc nie może działać, ponieważ nie przechowuje czasu mikro – goto

+0

To nie jest prawda w PHP 7. – Arthur

Powiązane problemy