Я работаю над веб-приложением на Laravel, которое опирается на Doctrine. База данных хранится на SQL Express 2017.
У меня возникла проблема с типом DateTime, как упоминалось в документация, когда я выполняю SELECT.
Не удалось преобразовать значение базы данных «2018-11-19 16: 19: 44.923» в Doctrine Type datetimetz. Ожидаемый формат: Y-m-d H: i: s.u P
Чтобы решить эту проблему, после некоторых исследований я создал свой собственный тип DateTime.
<?php
namespace App\Doctrine\Types;
use Doctrine\DBAL\Types\DateTimeType;
use Doctrine\DBAL\Platforms\AbstractPlatform;
class MsDateTime extends DateTimeType
{
private $dateTimeFormatString = 'Y-m-d H:i:s.u';
public function convertToDatabaseValue($value, AbstractPlatform $platform)
{
return ($value !== null) ? $value->format($this->dateTimeFormatString) : null;
}
}
Затем я отменяю тип по умолчанию:
Type::overrideType(Type::DATETIMETZ, 'App\Doctrine\Types\MsDateTime');
Итак, теперь я могу отображать данные, но не могу вставлять новые строки: Возникла исключительная ситуация при выполнении 'INSERT INTO table (row1, row2, active, date_created, timestamp) VALUES (?,?,?,?,?)' С params ["Test", "Test", 1, "2018-11 -20 16: 12: 11.349245 "," 2018-11-20 16: 12: 11.349250 "]
Я хотел бы знать, почему я не могу хранить новые строки. Если у вас есть исправления для Doctrine с SQLServer, я был бы очень благодарен!
Мы также используем Python с SQL Alchemy для запроса той же базы данных, и у нас нет такой проблемы.
Я установил формат datetime в SQL EXPRESS на Datetime2. Однако я могу обновить / вставить, но не могу выбрать. Получил Ожидаемый формат: Y-m-d H: i: s.u P.





Работая с Microsoft Sql Server Express 2017, вы должны сначала убедиться, что вы используете SQLServer2012Platform в конфигурации / автозагрузчике Doctrine.
Я указываю это следующим образом (в Codeigniter):
$myPlatform = new \Doctrine\DBAL\Platforms\SQLServer2012Platform();
$connectionOptions = array(
'driver' => 'pdo_sqlsrv',
'user' => $db['default']['username'],
'password' => $db['default']['password'],
'host' => $db['default']['hostname'],
'dbname' => $db['default']['database'],
'platform' => $myPlatform
);
Я переключил все свои поля SQL с DATETIME на DATETIME2, и вставки / обновления работают хорошо.
Мои сущности Doctrine определены с типом datetime, и я могу кормить их собственными объектами DateTime().
/**
* @var \DateTime
*
* @ORM\Column(type = "datetime", nullable = true)
*/
protected $created;
/**
* @var \DateTime
*
* @ORM\Column(type = "datetime", nullable = true)
*/
protected $updated;
/**
* @ORM\PrePersist
* @ORM\PreUpdate
*/
public function updatedTimestamps(): void
{
if ($this->created === null) {
$this->created = new \DateTime();
}
$this->updated = new \DateTime();
}
Надеюсь это поможет!
Из-за известных проблем я бы отказался от типа datetimetz. Видеть Доктрина - известные проблемы поставщиков - Microsoft SQL Server
Можете ли вы изменить формат строки даты так, чтобы он был 20181120 16: 12: 11.349245, также может быть слишком много десятичных знаков для DateTime, вам может понадобиться DateTime2 в SQL. ГГГГММДД - это формат даты ISO для SQL, почти всегда работает в строках SQL.