Laravel与SQL Server 2008出现“将varchar数据类型转换为datetime数据类型时导致超出范围的值”错误。

6

我正在使用带有SQL Server 2008的Laravel 4.1。

我基于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][ODBC Driver 11 for SQL Server][SQL Server] 将varchar数据类型转换为datetime数据类型时导致值超出范围。 (SQL: 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))
5个回答

5
我创建了一个新方法,格式如下:
 /**
 * Get the format for database stored dates.
 *
 * @return string
 */
public function getDateFormat() {
    return 'Y-d-m H:i:s';
}

我希望你能有所帮助。


很棒的答案!对于那些因商业原因无法更改此代码片段或此设置在某些环境中有效但在其他环境中无效的人,我建议阅读我的答案。 - Genarito

1
我在使用Symfony中的Doctrine自定义类型时遇到了同样的问题。像其他答案一样,我有一个类指定DateTime对象格式化为与DB一起工作的DateTime格式。在我的情况下是Y-d-m H:i:s.000,在生产中完美运行,但在我的本地环境中不行,抛出将varchar数据类型转换为datetime数据类型导致超出范围的值
解决方案是更改Symfony(在您的情况下为Laravel)用于连接到DB的默认语言用户:在生产中为Spanish,而我的本地设置为English这个答案 帮助我做出改变并解决问题。 注意:即使在每个数据库上更改语言,使用SET DATEFORMAT也无法解决我的问题。

1

仅供记录,此问题可以通过确保在 getDateFormat 函数中使用一个明确的日期格式(与地区无关)来解决,例如:

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


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的安装和默认语言(排序)设置中存在严重的兼容性问题。

我尝试过了,但是出现了同样的错误。 问题可能是 Laravel,因为 Eloquent 负责插入。 - jics
你的电脑或者你的SQL服务器所在地是否使用非英语语言? - Grantly
最后,当插入值时,我不得不转换DateTime格式。谢谢大家。 - jics

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);
}

它不起作用 :( 你使用哪种数据类型,datetime 还是 datetime2? - jics
我也遇到了同样的问题,但是使用你的代码后 Laravel 仍然报错 :'( - jics

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接