Хранение «времени» в базе данных - что использовать DateTime / Interger / VarChar - PullRequest
0 голосов
/ 14 октября 2011

Я хочу сохранить дату и время пользователя для различных выполненных действий. Для даты я решил использовать столбец DateTime в базе данных, а для времени у меня возникла дилемма, какой тип данных выбрать.

Я знаю, что в SQL Server 2008 введен тип данных времени, но я использую более старую версию, т. Е. Sql Server 2005, поэтому Мне нужно ваше предложение, чтобы доказать, что мое понимание верно или неверно.

Я видел людей, использующих varchar или DateTime для хранения времени в базе данных. Но я рассчитываю на использование типа данных Integer.

Причина моего выбора - производительность.

Ниже приводится оправдание, которое я даю себе.

Предположения

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

Дата будет сохранена в формате мм / дд / гггг чч: мм: сс, где чч: мм: сс всегда будет 00:00:00 Время будет сохранено в правильном формате (от чч: мм: сс до ччМмсс)

if hh is 00 
  then MMss
and if MM is 00
  then ss
and if ss is 00 
  then 0

hh will range in between 0-23
MM will range in between 0-59
ss will range in between 0-59

i.e. few examples
00:00:00 = 0
00:01:00 = 100
01:00:00 = 10000
13:00:00 = 130000

Личная мысль, почему это будет работать лучше.

SELECT * FROM Log WHERE loginDate = '05/23/2011' 
AND loginTime BETWEEN 0 AND 235959 --Integer Comparison

При использовании JOINS на основе DateTime с учетом объединения только для части Date.

СОЕДИНЕНИЕ двух таблиц на основе общих дат независимо от времени. Я думаю, что преобразование типов в таких случаях сильно повлияет на использование DateTime в качестве типа данных хранилища.

Так как Sql должен будет выполнить целочисленное сравнение, и не нужно вводить типы, следовательно, он должен работать лучше.

EDIT

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

Ответы [ 2 ]

1 голос
/ 14 октября 2011

Принимая во внимание ваши правки, ваше идеальное решение - поместить дату и время в один столбец, а DATETIME:

  • Затем вы можете легко вычислить разницу между временем начала и окончания с помощью DATEDIFF
  • Вы можете легко установить только часть даты с помощью CONVERT(varchar(10), loginDate, 101)
  • Вы можете легко установить только часть времени с помощью CONVERT(varchar(10), loginDate, 108)

Проблемы хранения могут быть решены с помощью SMALLDATETIME, если точность <1 минуты не требуется. Для <code>SMALLDATETIME требуется четыре байта на столбец, что соответствует INTEGER, поэтому вы получаете значительный чистый выигрыш по сравнению с использованием двух столбцов.

1 голос
/ 14 октября 2011

Так зачем вам 2 колонки.Если столбец DateTime (loginDate) имеет пустое время 00:00:00, почему бы просто не использовать это пустое пространство для loginTime и иметь один столбец.

WHERE loginDate >= '05/23/2011' AND loginDate < '05/24/2011'

Если вы намереваетесь использовать целое число, естьв этом нет ничего плохого.

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