2012-05-10 53 views
5

我在apache服務器上使用Doctrine 2.2和php 5.3。Doctrine 2:無法更新SQL Server 2008上的DateTime coloumn

到目前爲止,我在下面的問題絆倒: 當我嘗試更新日期時間列我得到: SQLSTATE [22007]:[微軟] [SQL Server本機客戶端10.0] [SQL服務器]轉換失敗時從字符串中轉換日期和/或時間。

我甚至已經走到了這一列,然後使用它只有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); 

是否有人知道一個解決方法在這裏?

這裏的任何幫助,非常感謝。

回答

0

您傳遞給datetime字段的值是多少?你應該通過一個實例Datetime

$entity->setDate(new \Datetime()); 
+0

是的,我路過一個DateTime實例。我做的是如下(生日是我改變日期的列....並且是我可能爲數不多的幾列之一): $ help = $ object-> getBirthDate(); //返回datetime對象,它代表數據庫中的出生日期 $ help-> setTimestamp(mktime($ time [0],$ time [1],$ time [2],$ date [2],$ date [ 1],$日期[0])); $ help-> format(\ DateTime :: ISO8601); $ object-> setBirthDate($ help); – Thomas

6

其官方的bug學說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; 
} 
+4

3年後的今天,DBAL是2.5 ...並且仍然沒有修復:(我也必須在Doctrine 1.x中使用SQL Server做這樣的變通辦法。你好嗎?像這樣的高質量的庫不會賺取信譽的企業,除非這些事情得到妥善解決。對不起咆哮,但是我那些誰嘗試在很大程度上是M $店鋪推動OSS的一個。類似這樣的問題不會幫我的情況。 – DinoAmino

+0

我怎樣才能避免改變是在作曲家的文件?我如何註冊自己的類型? –

+0

謝謝,幫我修復這個bug在我們的舊的項目之一。 –

3

我就遇到了這個問題與主義2.5和SQL Server 2012的問題是,數據庫字段類型爲DATETIME,但doctirne僅在SQLServer2008Platform上支持DATETIME2

您不應該編輯供應商目錄中的文件。正確的答案是創建一個自定義類型: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 
+0

若要將此類之外的symfony(如果使用'學說,orm'直接),只需添加'使用Doctrine \ DBAL \類型\型號,類型:: overrideType(類型:: DATETIME,' YourNameSpace \ DateTimeTypeSqlServer2012');'在你的任何地方r代碼在使用任何標準與日期之前。我將它添加到生成EntityManager類的函數中,因此它是一種永久性修復。 – shadi