хранить одну дату и два поля времени - PullRequest
1 голос
/ 03 марта 2011

Мне нужно хранить расписание и время. Scheduale содержит одно поле даты и два поля времени.

Есть ли возможность хранить расписание в одном поле БД, а не в двух (дата-время + дата-время)?

Я использую SQL Server 2005.

Спасибо!

Ответы [ 3 ]

2 голосов
/ 03 марта 2011

Будь то «начало» + «остановка» или «начало» + «длительность», у вас есть 2 элемента информации = храните 2 элемента информации.

Использование строки или XML не даетсмысл: для этого требуется больше места, больше обработки, больше кода для поиска и использования.

1 голос
/ 03 марта 2011

Почему вы хотите хранить то, что фактически является двумя датами в одном поле, а не в двух?Нет ли случаев, когда в расписании могут быть пересечения дней?(т.е. 01.03.2011 23:59, 03.02.2011 01:35)?Вы не возражаете против того, чтобы разбирать информацию, а не сразу готовить ее к запросу?

Если вы действительно этого хотите, нет причины, по которой вы не можете сохранить ее как строковый тип, возможно, через запятую, возможноXML в соответствии с предложением, но я не могу сказать, что он рекомендуется, поскольку поля даты / времени более компактны, удобны и быстры / гибки для целей поиска, и есть много полезных функций T-SQL, которые можно легко использовать для типов даты / временикоторую вам будет трудно использовать в строке без разбора и приведения / преобразования.

Если у вас есть веская причина не использовать два поля даты и времени, у меня будет еще один пончик!(ps. happy Fat четверг).

Одна быстрая и ужасно злая мысль ... вы могли бы использовать часть даты и времени, чтобы сохранить «разницу» ... подсунуть ее в «секунды» и «миллисекунды»"значения и применить его к основной дате / времени, чтобы получить новое значение.Немного хакерский, но он может сработать, в зависимости от ваших требований к диапазону.

-- Example: 01/03/2011 12:30:02
-- Translates into - first of March 2011, 12:30 to 14:30 (12:30 + (seconds * hours))

set @ModifiedDatetime =
    DATEADD(hour, DATEPART(second, @originalDateTime), @originalDateTime);

Остерегайтесь ошибок округления с миллисекундами ... и, пожалуйста, подумайте о последствиях того, что вы делаете.Бог убивает котенка каждый раз, когда кто-то злоупотребляет типом:)

1 голос
/ 03 марта 2011

Вы можете попробовать использовать тип поля XML и сохранить там фрагмент XML, аналогично следующему:

<schedule date="2011-01-01" fromTime="12:00" toTime="14:00" />

Затем вы можете использовать XQuery для выбора, чтобы преобразовать набор результатов обратно в «обычный» набор результатов на основе строк. Пример запроса, реализующего XQuery, основанный на схеме XML моего примера, может выглядеть следующим образом:

SELECT
    [...]
  , Schedule.value('(/schedule/@date)[1]','datetime') as [Date]
  , Schedule.value('(/schedule/@fromTime)[1]','char(5)') as [FromTime]
  , Schedule.value('(/schedule/@toTime)[1]','char(5)') as [ToTime]
FROM [TABLE]

Я не говорю, что хранение его в формате XML - лучший способ сделать это (как справедливо утверждают другие ответы), но вы спросили, ЕСЛИ это возможно, и я предлагаю решение ...

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