我正在使用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))
我用以下格式创建了一个新方法:
/**
* Get the format for database stored dates.
*
* @return string
*/
public function getDateFormat() {
return 'Y-d-m H:i:s';
}
我希望有人有用
我建议日期值应该有单引号...就像'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中的安装和默认语言(排序规则)设置存在严重的兼容性问题
我使用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);
}
只是为了记录,在任何情况下都可以修复此问题,确保在注释的getDateFormat
函数中使用明确的日期格式(独立于区域),例如:
YMD H:i:s
或Y-M-DTH:i:s.mmm
。