Горе (иногда) хранения "только даты" в datetime - PullRequest
2 голосов
/ 14 апреля 2010

У нас есть два поля from и to (типа datetime), где пользователь может хранить время начала и время окончания командировки, например:

From: 2010-04-14 09:00
  To: 2010-04-16 16:30

Таким образом, продолжительность поездки составляет 2 дня и 7,5 часов.

Часто точное время заранее неизвестно, поэтому пользователь вводит даты без времени:

From: 2010-04-14
  To: 2010-04-16

Внутренне это сохраняется как 2010-04-14 00:00 и 2010-04-16 00:00, поскольку именно так поступают большинство современных библиотек классов (например, .net) и баз данных (например, SQL Server), когда вы сохраняете «только дату» в структуре datetime.Обычно это имеет смысл.

Однако при вводе 2010-04-16 в качестве даты to пользователь явно не означает 2010-04-16 00:00.Вместо этого пользователь имел в виду 2010-04-16 24:00, т. Е. Вычисление продолжительности поездки должно вывести 3 days, а не 2 days.

. Я могу придумать несколько (более или менее некрасивых) способов решения этой проблемы.(добавьте «23:59» в слой пользовательского интерфейса поля to, если пользователь не ввел компонент времени; добавьте специальное логическое поле «даты - полные дни»; магазин «2010-04-17 00:00»)в БД, но отображать «2010-04-16 24:00» для пользователя, если компонент времени «00:00»; ...), все имеют свои преимущества и недостатки.Поскольку я предполагаю, что это довольно распространенная проблема, мне было интересно:

  • Существует ли "стандартный" наилучший способ ее решения?
  • Если нет,испытывали ли вы подобное требование, как вы его решали и каковы были плюсы / минусы этого решения?

Ответы [ 2 ]

1 голос
/ 14 апреля 2010

Лучший способ IMO - использовать платформу или библиотеку классов, которая имеет , в которой понятие «дата» отделено от «даты и времени» и множества вариаций темы. (Не забудьте, что между «от» и «до» может быть переход на летнее время:)

В Java я бы предложил использовать Joda Time ; в .NET мой проект Noda Time , надеюсь, станет лучшим решением, когда он будет готов.

Так что в этом случае вам действительно нужно знать, была ли введена дата или полночь - они принципиально разные. Что бы вы ни делали, если они вводят «от» в качестве даты и «до» в качестве даты / времени, я не уверен ... вероятно, все еще используют «начало дня» для «от» и заданное время для "до" ... но это немного хитроумно.

По сути, вы должны попытаться сохранить всю информацию, которую вы знаете, и только информацию, которую вы знаете - так что если у вас нет отдельных типов, сохраните отдельное поле «это просто дата» кажется разумным. Это уродливо, но это потому, что платформа не помогает вам так сильно, как должна.

1 голос
/ 14 апреля 2010

Не существует волшебного способа сделать это, который значительно улучшил бы сохранение 23:59 (или любого уровня точности, который вы предпочитаете) в поле 'to'.

Этот тип требований появляется в системах администрирования страховых полисов, используемых в юрисдикциях США. Часто даты начала и окончания срока действия должны быть записаны вместе со временем, а даты окончания срока действия записываются как xxxx-xx-xx 23:59. К сожалению, для этого нет волшебной формулы, кроме установки по умолчанию компонента времени на: поля до 23:59.

...