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

标签 sql-server laravel

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

$table->dateTime('myDateTimeColumn');

if 将创建一个 datetime 字段,而不是 datetime2 字段。

如何在迁移后强制使用 datetime2 列而不更改它们(这听起来很草率)?

最佳答案

通过向创建日期时间列的方法添加一个精度整数来强制使用 datetime2。

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

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

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

Illuminate\Database\Schema\Grammars\SqlServerGrammer.php

它包含这个函数:

    /**
     * Create the column definition for a date-time type.
     *
     * @param  \Illuminate\Support\Fluent  $column
     * @return string
     */
    protected function typeDateTime(Fluent $column)
    {
        return $column->precision ? "datetime2($column->precision)" : 'datetime';
    }

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

当您没有为创建日期时间列的迁移方法指定精度时,该测试将失败。

关于sql-server - 如何强制迁移创建 datetime2 字段而不是 datetime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46769546/

相关文章:

c# - 插入到 SQL Server 中的父子表中

regex - 如何在 Nginx 中提供嵌套项目

laravel - 如何将数组从 Controller 传递到 vue.js v-for?

php - 无效的日期时间格式 : 1292 Incorrect datetime value - Laravel 5. 2

php - Laravel 方法通知不存在

sql-server - 数据库设计

sql-server - 获取特定时间段内的查询执行次数

asp.net - 在前端捕获从 sql server 存储过程返回的错误消息

laravel - 在 Laravel 中将时间戳转换为日期?

sql-server - TSQL单元测试工具2017 : SQL Server Data Tools 2017 vs tSQLt