Zend-Db需要为每个插入查询设置日期格式


Zend Db needs dateformat set for every insert query

我正试图通过Zend''Db组件将几行插入MSSQL服务器数据库。有些字段包含德语格式的日期,因此为DD.MM.YYYY,但SQL Server需要YYYY-MM-DD。有一个SET DATEFORMAT DMY选项,它通过SQL Management Studio解决了我的问题。然而,在PHP和使用Zend''Db时,我必须将此语句放在每个INSERT语句之前。我不知道为什么?难道没有为整个会话设置此选项吗?

示例:

// $this->db is an instance of 'Zend'Db'Adapter'Adapter
$this->db->query("SET LANGUAGE German;")->execute();
$this->db->query("SET DATEFORMAT dmy;")->execute();
$sql = "INSERT INTO {$table}(";
...
$statement = $this->db->query($sql);
$result = $statement->execute();

结果:

Statement could not be executed (22007 - 241 - [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Conversion failed when converting date and/or time from character string.)

然而,当我写:

$sql = "SET DATEFORMAT DMY; INSERT INTO {$table}(";

它是有效的。

有什么建议吗?哪里出了问题,或者我需要改变什么?谢谢

使用这种基于dbAdapter->query()->execute()的方法,您将剥夺自己的富类Zend'Db'Sql。通过Zend'Db'Sql'Insert,简单地扩展这个类如下:

namespace MyProject'Db'Sql;
use Zend'Db'Sql'Insert as ZendInsert;
class Insert extends ZendInsert {
/**
 * @var array Specification array
 */
protected $specifications = [
    self::SPECIFICATION_INSERT => 'SET DATEFORMAT DMY; INSERT INTO %1$s (%2$s) VALUES (%3$s)',
    self::SPECIFICATION_SELECT => 'SET DATEFORMAT DMY; INSERT INTO %1$s %2$s %3$s',
];
}