使用SQL Server 2008的Laravel抛出“将varchar数据类型转换为日期时间数据类型导致超出范围的值”

问题描述 投票:5回答:4

我正在使用laravel 4.1和SQL Server 2008

我创建了一个基于Eloquent orm的模型,带有时间戳:

class Attendance extends \Eloquent {

protected $table = 'Attendance';

public function users(){return $this->belongsToMany('User', 'Users_Attendance', 'user_id', 'attendance_id');}

}

当我尝试插入新字段时:

public function postAttendanceUsers() {
    $attendance = new Attendance;
    $attendance->user_id = Auth::user()->id;
    $attendance->save();
}

显示以下错误:

SQLSTATE [22007]:[Microsoft] [SQL Server的ODBC驱动程序11] [SQL Server]将varchar数据类型转换为日期时间数据类型会导致超出范围的值。 (SQL:插入[考勤]([user_id],[updated_at],[created_at])值(40,2015-08-27 12:28:42.000,2015-08-27 12:28:42.000))

php sql-server sql-server-2008 laravel-4
4个回答
3
投票

我用以下格式创建了一个新方法:

 /**
 * Get the format for database stored dates.
 *
 * @return string
 */
public function getDateFormat() {
    return 'Y-d-m H:i:s';
}

我希望有人有用


1
投票

我建议日期值应该有单引号...就像'20151130'

或者更具体:

insert into [Attendance] ([user_id], [updated_at], [created_at]) values (40, '2015-08-27 12:28:42.000', '2015-08-27 12:28:42.000')

您可以使用精确的日期直接使用SQL测试它:

insert into [Attendance] ([user_id], [updated_at], [created_at]) values (40, '20150827', '20150827')

如果失败,则SQL中的安装和默认语言(排序规则)设置存在严重的兼容性问题


1
投票

我使用Laravel和SQL Server。尝试将此代码添加到您的Eloquent基本模型中。 Laravel尝试插入毫秒,SQL Server不喜欢它

/**
 * Get the format for database stored dates.
 *
 * @return string
 */
public function getDateFormat()
{
    return 'Y-m-d H:i:s.u';
}

/**
 * Convert a DateTime to a storable string.
 * SQL Server will not accept 6 digit second fragment (PHP default: see getDateFormat Y-m-d H:i:s.u)
 * trim three digits off the value returned from the parent.
 *
 * @param  \DateTime|int  $value
 * @return string
 */
public function fromDateTime($value)
{
    return substr(parent::fromDateTime($value), 0, -3);
}

1
投票

只是为了记录,在任何情况下都可以修复此问题,确保在注释的getDateFormat函数中使用明确的日期格式(独立于区域),例如:

YMD H:i:sY-M-DTH:i:s.mmm

© www.soinside.com 2019 - 2024. All rights reserved.