структура сущности, переход от datetime к datetimeoffset - PullRequest
0 голосов
/ 10 сентября 2018

что мы хотим:

У нас есть столбец в таблице в базе данных сервера SQL, тип данных которого 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() после этого исправляет смещенную часть.

вопросы:

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

1 Ответ

0 голосов
/ 20 февраля 2019

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

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

...