Различение столбцов с UTC и локальным datetime

#sql #sql-server #utc

#sql #sql-сервер #utc

Вопрос:

Я работаю над приложением, которое хранит даты и время в базе данных SQL Server. Некоторые из них представляют собой момент времени, сохраненный в UTC (например, даты и время элемента журнала), в то время как другие представляют собой буквальную дату / время (например, «примите лекарство X в 4 часа дня 20 июля, независимо от вашего часового пояса).

Проблема в том, что оба они имеют компонент даты и времени, поэтому использование типа столбца datetime2 имеет смысл для обоих. Сейчас мы находимся в ситуации, когда в нашем приложении часто неясно, является ли столбец даты / времени точкой UTC или буквальной датой / временем.

Какова наиболее распространенная практика для различения этих 2 случаев? Я могу подумать об этих вариантах:

1) Завершите все столбцы UTC…Utc, в то время как литеральные столбцы даты / времени не имеют специального окончания.

2) Завершите все литеральные столбцы…Литерал, в то время как столбцы даты / времени UTC не имеют специального окончания.

3) Присвоите столбцам UTC тип данных datetime2 и литеральные столбцы даты / времени datetimeoffset.

Комментарии:

1. можете ли вы изменить таблицу и добавить новый столбец? например. столбец флага isUTC , который показывает, является ли это временем UTC или нет…

2. Я довольно часто видел # 1 (и сам его использую). Я не видел # 2 «в дикой природе». Я бы не стал предлагать # 3

Ответ №1:

Всегда старайтесь сначала использовать соответствующий тип, а затем правильное именование. Если datetime2(0) подходит, используйте его.

В моей системе я добавляю суффикс к имени столбца, например: PlaybackStartedLocal datetime2(0) , PlaybackStartedUTC datetime2(0) . В моем случае я должен хранить как локальные, так и UTC значения для одного и того же события, потому что некоторым отчетам требуется локальное значение, некоторым UTC, и их очень сложно преобразовать между ними позже.

В целом рекомендуется включать единицы измерения в имя столбца / переменной.

Что вы предпочитаете видеть:

 PlaybackDurationMSec            or    PlaybackDuration
LengthMeters / LengthMiles      or    Length
  

Хорошо известный пример, когда две команды программистов не заметили, что они интерпретировали значения метрик как имперские и наоборот: Комиссия по расследованию стихийных бедствий сообщает, что орбитальный аппарат NASA Mars Climate Orbiter сгорел в атмосфере Марса, потому что инженеры не смогли перевести единицы измерения с английского на метрический.

Программное обеспечение рассчитало усилие, необходимое для работы двигателей, в фунтах силы. Отдельная часть программного обеспечения принимала данные, предполагая, что они были в метрической единице: ньютоны.