gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 20:37:18 25 4
gpt4 key购买 nike

我正在开发一个访问 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com