8

ApacheサーバーでDoctrine 2.2とphp 5.3を使用しています。

これまでのところ、次の問題に遭遇しました: datetime 列を更新しようとすると、次のようになります: SQLSTATE[22007]: [Microsoft][SQL Server Native Client 10.0][SQL Server]Conversion failed when conversion date and/or time文字列から。

私はこれまでのところ、列にアクセスし、それを使用して1日だけ追加して新しい日付を設定しました...同じ結果です。

代わりに、データベースとエンティティの両方の列を日時から日付に変更すると、意図したとおりに機能します。

私の主な問題は、日時列を使用する必要があるフィールドがいくつかあることです。

これが私のコードです:

(生年月日は私が日付に変更した列でした....そして、それが可能な数少ない列の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

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 フィールドを から に変更することだけですDATETIME(DATETIME2可能な限り) 。

于 2019-02-23T08:03:37.950 に答える
0

フィールドに渡す値は何datetimeですか? Datetimeインスタンスを渡す必要があります

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