Структура сущности, переход с datetime на datetimeoffset

что мы хотим:

У нас есть столбец в таблице в базе данных sql server с типом данных datetime. Мы решили изменить тип данных этого столбца на datetimeoffset(7).

что у нас есть на данный момент:

-первый подход:

В большинстве случаев предлагается сделать это (как видно из здесь) следующим образом:

  1. Добавьте новый столбец с вашим новым типом

  2. Используйте Sql (), чтобы перенять данные из исходного столбца с помощью оператора обновления

  3. Удалите старую колонку

  4. Переименуйте новый столбец

-второй подход:

но есть другое решение для выполнения этой работы (которое можно увидеть здесь), которое мы адаптировали следующим образом:

    // 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() после этого исправляет смещенную часть.

вопросы следующие:

Есть ли что-то важное, о чем нужно позаботиться, выбирая второй подход?
Есть ли причина, по которой люди предпочитают первый подход, хотя второй проще? Есть ли причина, по которой вы предлагаете один из этих подходов вместо другого?

2
0
867
1

Ответы 1

Если вам нужно иметь дело с историческими значениями даты и времени, которые могут быть во время местного перехода на летнее время, я бы выбрал вариант 2. Измените тип столбца, а затем используйте sql для обновления значения;

... _ColumnName_ = cast(_ColumnName_ as datetime2(7)) AT TIME ZONE '<name of timezone>'

Другие вопросы по теме