如何强制迁移创建datetime2字段而不是datetime

时间:2017-10-16 11:44:21

标签: sql-server laravel

我正在开发一个访问sqlserver数据库的laravel应用程序,我需要将我的日期字段设为datetime2。问题是,如果我告诉迁移引擎创建一个这样的日期时间字段:

$table->dateTime('myDateTimeColumn');

如果要创建datetime字段,而不是datetime2字段。

如何强制datetime2列而不必在迁移后更改它们(听起来非常草率)?

3 个答案:

答案 0 :(得分:1)

Illuminate/Database/Schema/Grammars/SqlServerGrammar.php

更改函数typeDateTime(),使其返回'datetime2'而不是日期时间。

对于typeTimestamp()你可以做同样的事情!

答案 1 :(得分:1)

通过向创建datetime列的方法添加精度int来强制执行datetime2。

$table->datetime(4);
$table->timestamp(4);
$table->timestamps(4);

使用datetime(),timestamp()或timestamps()而不指定整数将在SQL Server上生成DATETIME列类型,现在使用Laravel保存任何日期将破坏代码,因为{{1} }列类型仅允许微秒部分的3位数。 Laravel 有时 放置4位数的微秒,因此需要DATETIME

我在阅读Laravel的源文件时发现了解决方案:

DATETIME2

它包含此功能:

Illuminate\Database\Schema\Grammars\SqlServerGrammer.php

我也在GitHub上做了一个单元测试用例。 https://gist.github.com/spacemudd/abfa7ef66d096f3f20796bf373df365b

如果您未指定创建日期时间列的迁移方法的精度,那么该测试将失败。

答案 2 :(得分:0)

您可以执行相同的$table->addColumn('type','name')

$table->addColumn('datetime','myDateTimeColumn');

我希望这会有所帮助。