8

我在 apache 服务器上使用 Doctrine 2.2 和 php 5.3。

到目前为止,我偶然发现了以下问题:当我尝试更新日期时间列时,我得到:SQLSTATE[22007]: [Microsoft][SQL Server Native Client 10.0][SQL Server]Conversion failed when conversion date and/or time从字符串。

到目前为止,我什至已经进入该列,然后使用它只添加了 1 天来设置新日期......结果相同。

相反,当我将数据库中的列和实体中的列从日期时间更改为日期时,它会按预期运行。

我的主要问题是,有几个字段我需要使用日期时间列。

这是我的代码:

(生日是我更改为日期的列......并且是为数不多的对我来说可能的列之一):

//This returns the datetime object that represents birthdate from the database 
$help=$object->getBirthDate(); 
$help->setTimestamp(mktime($time[0],$time[1],$time[2],$date[2],$date[1],$date[0])); 
$help->format(\DateTime::ISO8601); 
$object->setBirthDate($help);

有人知道这里的解决方法吗?

4

4 回答 4

14

我在 Doctrine 2.5 和 SQL Server 2012 中遇到了这个问题。问题是数据库字段是 type DATETIME,但 doctirne 只支持DATETIME2SQLServer2008Platform 及更高版本。

您不应该在您的供应商目录中编辑文件。正确的答案是创建一个自定义类型:Doctrine Custom Mapping Types。就我而言,我扩展了当前的 DateTimeType:

<?php

namespace AppBundle\Doctrine\Type;

use Doctrine\DBAL\Types\DateTimeType;
use Doctrine\DBAL\Platforms\AbstractPlatform;

class DateTime extends DateTimeType
{
    private $dateTimeFormatString = 'Y-m-d H:i:s.000';

    public function convertToDatabaseValue($value, AbstractPlatform $platform)
    {
        return ($value !== null)
            ? $value->format($this->dateTimeFormatString) : null;
    }

}

然后在 Symfony config.yml 中:

    types:
      datetime: AppBundle\Doctrine\Type\DateTime
于 2017-03-08T18:09:59.890 回答
7

它是 Doctrine 2.2 中的官方错误,将在 2.3 中解决。

微秒被转换为具有错误数量的零的字符串。

解决方法:更改文件 /Doctrine/DBAL/Types/DateTimeType.php 中的函数 convertToDatabaseValue:

public function convertToDatabaseValue($value, AbstractPlatform $platform)
{
   if( $value === null)
      return null;

   $value = $value->format($platform->getDateTimeFormatString());

   if( strlen($value) == 26 &&
         $platform->getDateTimeFormatString() == 'Y-m-d H:i:s.u' &&
         ($platform instanceof \Doctrine\DBAL\Platforms\SQLServer2008Platform
          ||
         $platform instanceof \Doctrine\DBAL\Platforms\SQLServer2005Platform
         ) )
      $value = substr($value, 0, \strlen($value)-3);
   return $value;
}
于 2012-05-16T11:57:09.783 回答
1

Microsoft SQL Server Express 17 和 Doctrine ORM v2.6.3/DBAL v2.9.2 仍然存在同样的问题。(对于 Doctrine Platform,我使用SQLServer2012Platform)。

您需要做的就是将您的 SQL 字段从更改DATETIMEDATETIME2类型(尽可能)

于 2019-02-23T08:03:37.950 回答
0

您传递给该datetime领域的价值是什么?你应该传递一个Datetime实例

$entity->setDate(new \Datetime());
于 2012-05-10T06:24:45.387 回答