Страница 1 из 1

Datetime format with microseconds

Добавлено: 2021.06.15, 11:45
long399
Здравствуйте, помогите, пожалуйста, с одним вопросом.

У меня есть таблица, один из столбцов в которой имеет типа datetime.

Код: Выделить всё

$this->createTable('{{%mytable}}', [
    ...
    'created_at' => $this->dateTime()->notNull(),
    ...
]);
1) Записываю в это после значение такого рода: 2021-03-29T15:52:42.115448+03:00 (это данные в формате Y-m-d\TH:i:s.uP).
2) В базу данных это все сохраняется, но обрубается все, после секунд и лежит в таком виде: 2021-03-29 15:52:42. Формат в БД не настраивал, видимо, это дефолтный формат Y-m-d H:i:s.

Когда я получаю данные из БД в модель и вывожу их, они выводятся в таком же виде как в пункте 2. При попытке привести к нужному мне формату Y-m-d\TH:i:s.uP

Код: Выделить всё

$tmp = \DateTime::createFromFormat('Y-m-d H:i:s', $this->created_at)->format('Y-m-d\TH:i:s.uP');
микросекунды зануляются и неправильно выводится временная зона: 2021-03-29T15:52:42.000000+02:00

Пробовал добавлять параметр precision (3, 6, 9) при создании столбца в миграции, не помогло. Подскажите, как привести данные из БД к виду как в пункте 1?

Re: Datetime format with microseconds

Добавлено: 2021.06.15, 11:57
rak
нужно сначала без миграций попробовать создать в бд поле и проверить, чтобы работало там, а потом уже пробовать с миграциями
https://dev.mysql.com/doc/refman/8.0/en ... conds.html
Версия mysql какая?

Re: Datetime format with microseconds

Добавлено: 2021.06.15, 12:36
long399
rak писал(а): 2021.06.15, 11:57 Версия mysql какая?
10.1.38-MariaDB
rak писал(а): 2021.06.15, 11:57 нужно сначала без миграций попробовать создать в бд поле и проверить, чтобы работало там, а потом уже пробовать с миграциями
https://dev.mysql.com/doc/refman/8.0/en ... conds.html
попробовал создать таблицу fractest, как показано в ссылке, что Вы привели. Вроде бы получилось, проблем не заметил.
Вывод как в примере, только микросекунды округлены до 77. Но это из-за TIME_TRUNCATE_FRACTIONAL mode, насколько я понял из информации по ссылке опять же.

Код: Выделить всё

+-------------+------------------------+------------------------+
| c1          | c2                     | c3                     |
+-------------+------------------------+------------------------+
| 17:51:04.77 | 2018-09-08 17:51:04.77 | 2018-09-08 17:51:04.77 |
+-------------+------------------------+------------------------+

Re: Datetime format with microseconds

Добавлено: 2021.06.15, 13:03
long399
Попробовал вручную в базе отредактировать столбец и добавить ему precision. Теперь время стало сохранятся с микросекундами.

Миграции немного переделал, добавил команду, устанавливающую точность.

Код: Выделить всё

$this->createTable('{{%mytable}}', [
    ...
    'created_at' => $this->dateTime()->notNull(),
    ....
]);
$this->db->createCommand('ALTER TABLE mytable MODIFY created_at DATETIME(6) NULL;')->execute();
Через параметр dateTime() точность почему-то не добавляется.