我们在sql server数据库的表中有一列,其数据类型为datetime
。
我们决定将此列的数据类型更改为datetimeoffset(7)
。
通常建议这样做的方式(可以看到here)是:
使用新类型添加新列
使用Sql()通过更新语句从原始列中接管数据
但是还有另一种解决方案可以做到这一点(可以在here中看到),我们对此进行了如下修改:
// this is part of our migration file:
public override void Up()
{
AlterColumn("_TableName_", "_ColumnName_", c => c.DateTimeOffset(nullable: true, precision: 7));
Sql(@"
update Tralus.MelkRadar.Crawl
set _ColumnName_ = todatetimeoffset(_ColumnName_, '+04:30')
");
}
AlterColumn
更改数据库中的数据类型,同时保留数据并将offset
的部分数据设置为00:00
Sql()
语句更正了偏移量部分。采用第二种方法时,有什么重要的事情要注意吗?
尽管第二种方法更容易实现,但是人们为什么会偏爱第一种方法呢?
有什么理由使您建议其中一种方法而不是另一种方法?
答案 0 :(得分:0)
如果您需要处理历史日期时间值(可能是在当地夏令时期间),我将选择选项2。更改列类型,然后使用sql更新值;
... _ColumnName_ = cast(_ColumnName_ as datetime2(7)) AT TIME ZONE '<name of timezone>'