Datetime format with microseconds

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
long399
Сообщения: 80
Зарегистрирован: 2019.08.13, 08:03
Откуда: г. Новосибирск

Datetime format with microseconds

Сообщение 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?

rak
Сообщения: 2171
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: Datetime format with microseconds

Сообщение rak »

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

long399
Сообщения: 80
Зарегистрирован: 2019.08.13, 08:03
Откуда: г. Новосибирск

Re: Datetime format with microseconds

Сообщение 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 |
+-------------+------------------------+------------------------+

long399
Сообщения: 80
Зарегистрирован: 2019.08.13, 08:03
Откуда: г. Новосибирск

Re: Datetime format with microseconds

Сообщение long399 »

Попробовал вручную в базе отредактировать столбец и добавить ему precision. Теперь время стало сохранятся с микросекундами.

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

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

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

Ответить