Хранение промежутка времени между двумя датами - PullRequest
2 голосов
/ 15 июня 2011

Мне нужен способ хранения и манипулирования диапазоном дат с использованием C # и хранения данных в базе данных SQL.Хранение двух DateTimes - лучший способ сделать это?

Например, мне нужно, чтобы сотрудники могли выбрать продолжительность, которую они потратили на работу над конкретным проектом, выбрав дату начала и дату окончания с помощью DatePicker.

У меня есть следующие дополнительные требования:

  • Мне нужно поддерживать полдня в начале и / или конце периода.
  • Мне нужно иметь возможность рассчитать количество дней между двумя датами (как двойное, где 0,5 - это полдня).
  • Мне нужно рассчитать количество рабочих дней между двумя датами (как двойное).
  • Промежуток времени должен отображаться в календаре jquery.
  • Минимальная продолжительность составляет полдня.

    A Диапазон дат 1/2 дня с 24 мая по полный день 27 мая: 2011-05-24 12:00:00.000 => 2011-05-28 00: 00: 00.000

    A Диапазон дат полного дня с 24 мая по 1/2 дня 27 мая: 2011-05-24 00: 00: 00.000 => 2011-05-27 12: 00: 00.000

    Полдня 24 мая: 2011-05-24 12: 00: 00.000 => 2011-05-25 00: 00: 00.000

    Полный день 24 мая: 2011-05-24 00: 00: 00.000 => 2011-05-25 00: 00: 00.000

Имеет ли это представление смысл?Стоит ли мне смотреть на хранение DateTime для StartDate и TimeSpan с учетом моих требований?

Редактировать: также

Имеет ли смысл представление даты окончания?Таким образом, 2-е мая будет сохранено как «2011-05-03 00: 00: 00.000», потому что тогда заканчивается продолжительность.Имея это в виду, мне нужно будет вычесть день из даты окончания при отображении этого в календаре.

Ответы [ 6 ]

2 голосов
/ 15 июня 2011

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

Критическим аспектом диапазонов дат является то, как обрабатывать границы.Вы можете использовать маппер для даты начала / окончания, чтобы гарантировать правильное вычисление времени (Внутри / Касание):

// ----------------------------------------------------------------------
public void TimePeriodMapperSample()
{
  TimeCalendar timeCalendar = new TimeCalendar();
  CultureInfo ci = CultureInfo.InvariantCulture;

  DateTime start = new DateTime( 2011, 3, 1, 13, 0, 0 );
  DateTime end = new DateTime( 2011, 3, 1, 14, 0, 0 );

  Console.WriteLine( "Original start: {0}",
                     start.ToString( "HH:mm:ss.fffffff", ci ) );
  // > Original start: 13:00:00.0000000
  Console.WriteLine( "Original end: {0}",
                     end.ToString( "HH:mm:ss.fffffff", ci ) );
  // > Original end: 14:00:00.0000000

  Console.WriteLine( "Mapping offset start: {0}", timeCalendar.StartOffset );
  // > Mapping offset start: 00:00:00
  Console.WriteLine( "Mapping offset end: {0}", timeCalendar.EndOffset );
  // > Mapping offset end: -00:00:00.0000001

  Console.WriteLine( "Mapped start: {0}",
    timeCalendar.MapStart( start ).ToString( "HH:mm:ss.fffffff", ci ) );
  // > Mapped start: 13:00:00.0000000
  Console.WriteLine( "Mapped end: {0}",
    timeCalendar.MapEnd( end ).ToString( "HH:mm:ss.fffffff", ci ) );
  // > Mapped end: 13:59:59.9999999
} // TimePeriodMapperSample

Ознакомьтесь со статьей Библиотека периодов времени для .NET (раздел КалендарьПериоды времени).

1 голос
/ 15 июня 2011

В идеале вам понадобится два поля в любом случае:

  • Хранить две даты / времени отдельно - ИЛИ -
  • Сохранить одну дату / время и сохранить истекшее время

Рассматривая ваши требования, я бы выбрал два отдельных поля даты / времени ; и рассчитать полные / полдни, включая (сложение / вычитание) праздничные дни.

Сохраните отдельную таблицу конфигурации для определения / настройки максимальной / минимальной продолжительности дня.

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

1 голос
/ 15 июня 2011

Хранить только даты начала и окончания. Затем для подсчета количества отработанных дней:

Round(DateDiff(hour, StartDate, EndDate)/24, 2)
0 голосов
/ 15 июня 2011

Я полагаю, что два поля DateTime вместе с флажками, соответствующими дате начала и окончания, указывают, будет ли для вас достаточной половина или полный день.на основе состояния флажка вы можете манипулировать компонентом времени в соответствии с вашими потребностями.Вам просто нужно сохранить значения Start и End DateTime, которые будут соответствовать опубликованным вами требованиям.

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

Это действительно зависит от того, как вы собираетесь использовать ваши данные. Если ваша вторая дата никогда не будет использоваться вне расчета TimeSpan, вы не должны сохранять ее, а вместо этого сохранять TimeSpan. Если вы часто используете дату окончания и редко рассчитываете продолжительность, вы должны сохранить 2 даты и времени.

Вы даже можете сохранить эти три значения, если используете их часто, и увеличение объема памяти не является проблемой.

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

Мне кажется, что хранить 2 даты и времени имеет смысл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...