#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 сгорел в атмосфере Марса, потому что инженеры не смогли перевести единицы измерения с английского на метрический.
Программное обеспечение рассчитало усилие, необходимое для работы двигателей, в фунтах силы. Отдельная часть программного обеспечения принимала данные, предполагая, что они были в метрической единице: ньютоны.