使用Laravel的pdo_sqlsrv和日期格式

时间:2013-12-17 16:49:29

标签: php sql-server pdo laravel laravel-4

我想暂时尝试Laravel,所以我花了整个下午设置它。

在Windows上我安装了:WAMP 32位PHP 5.4,SQL Server 3.0驱动程序来自Microsoft(这就是我使用WAMP 32位的原因)和Composer。

然后我创建了一个项目,下载Laravel和生成器。我创建了一个脚手架来查看它生成的代码类型并对其进行测试。

由于nvarchar到datetime转换错误,我的第一个“创建”操作失败。我在SQL Server Management Studio(SSMS)中粘贴了查询,并以相同的结果激活它。

错误来自日期格式。 Laravel这样说:“2013-12-17 16:55:124”。但在请求之前,它会向SQL Server发送一些设置,其中一个非常有趣:

set dateformat dmy

对我来说set dateformat dmy意味着它需要这样的日期: “17-12-2013 16:55:124”

在SSMS中将set dateformat更改为:

set dateformat ymd

或更改请求中的日期格式使其有效。

我不认为这是一个错误。我只是觉得有些东西是错误配置的。我只是不知道是什么。

2 个答案:

答案 0 :(得分:1)

我终于找到了一种方式,看起来很干净。诀窍是强制Laravel使用datetime2而不是datetime与SQL Server。

为了做到这一点,你需要做这些改变:

在Illuminate / Database / Schema / Grammars / SqlServerGrammar.php中

protected function typeDateTime(Fluent $column)
{
    return 'datetime'; // Change to datetime2
}

protected function typeTimestamp(Fluent $column)
{
    return 'datetime'; // Change to datetime2
}

然后在Illuminate / Database / Query / Grammars / SqlServerGrammar.php中:

public function getDateFormat()
{
    return 'Y-m-d H:i:s.000'; // change to 'Y-m-d H:i:s.0000000'
}

我希望它有助于某人...

答案 1 :(得分:0)

我使用DB :: raw wit SQL修复了datetime的服务器特定语法。

public function datetime() {

    $addDate = DB::insert("insert into TABLE (date) values (convert(date,'$date',127))");

}

我不确切知道它为什么会发生,但与经典Laravel DB语法相同的函数返回SQLSTATE [22007]。

public function datetime() {

    $addDate = DB::table('TABLE')
    ->insert([
        'date'=> $date]);

   // return SQLSTATE[22007]
}