Лучший способ сохранить время (чч: мм) в базе данных - PullRequest
88 голосов
/ 11 февраля 2009

Я хочу хранить время в таблице базы данных, но нужно только хранить часы и минуты. Я знаю, что могу просто использовать DATETIME и игнорировать другие компоненты даты, но как лучше всего это сделать, не сохраняя больше информации, чем мне нужно?

Ответы [ 15 ]

1 голос
/ 12 февраля 2009

Вы уверены, что вам когда-нибудь понадобятся часы и минуты? Если вы хотите сделать что-то значимое с этим (например, вычислить промежуток времени между двумя такими точками данных), не имея информации о часовых поясах и DST, это может дать неверные результаты. Часовые пояса, возможно, не применяются в вашем случае, но DST наверняка будет.

1 голос
/ 11 февраля 2009

Попробуйте smalldatetime. Он может не дать вам того, что вы хотите, но он поможет вам в ваших будущих потребностях в манипуляциях с датой / временем.

0 голосов
/ 12 августа 2017

ИМХО, какое наилучшее решение в некоторой степени зависит от того, как вы храните время в оставшейся части базы данных (и в остальной части вашего приложения)

Лично я работал с SQLite и стараюсь всегда использовать метки времени unix для хранения абсолютного времени, поэтому при работе со временем суток (как вы и просили) я делаю то, что пишет Глен Солсберри в своем ответе и хранить количество секунд с полуночи

При таком общем подходе люди (включая меня!), Читающие код, будут менее смущены, если я везде использую один и тот же стандарт

0 голосов
/ 17 июня 2015

Сохраните ticks как long / bigint, которые в настоящее время измеряются в миллисекундах. Обновленное значение можно найти, посмотрев на значение TimeSpan.TicksPerSecond.

Большинство баз данных имеют тип DateTime, который автоматически сохраняет время в виде тиков за кадром, но в случае некоторых баз данных, например, SqlLite, хранение тиков может быть способом сохранения даты.

Большинство языков позволяют легко конвертировать из TicksTimeSpanTicks.

Пример

В C # код будет:

long TimeAsTicks = TimeAsTimeSpan.Ticks;

TimeAsTimeSpan = TimeSpan.FromTicks(TimeAsTicks);

Имейте в виду, хотя, потому что в случае SqlLite, который предлагает только небольшое количество различных типов, которые; INT, REAL и VARCHAR Необходимо будет хранить количество тиков в виде строки или двух INT ячеек вместе взятых. Это потому, что INT - это 32-битное число со знаком, а BIGINT - это 64-битное число со знаком.

Примечание

Однако я предпочитаю хранить дату и время в виде строки ISO8601.

0 голосов
/ 15 июня 2010

Экономия времени в формате UTC может помочь лучше, как предложила Кристен.

Убедитесь, что вы используете 24-часовые часы, поскольку в UTC нет меридиана AM или PM.

Пример:

  • 4: 12 AM - 0412
  • 10: 12 AM - 1012
  • 14:28 * 144
  • 11: 56 PM - 2356

По-прежнему предпочтительнее использовать стандартный четырехзначный формат.

...