В частности, мне нужны только часы: минуты, но скажу, что у меня есть объект .NET TimeSpan, как я должен хранить это в базе данных SQL (CE)?
Каков наилучший способ представления временного интервала в SQL Server CE?
Ответ 1
Я бы рекомендовал использовать long для представления числа ticks. То, что TimeSpan использует как внутреннее представление. Это позволяет легко восстановить объект с помощью метода Timespan.FromTicks() и выводить его в базу данных с помощью свойство Timespan.Ticks. Наименьшей единицей времени в .NET является галочка, которая равна 100 наносекундам.
Ответ 2
SQL CE не имеет типа времени или определяемых пользователем типов, поэтому ваши варианты - это datetime или int, представляющие минуты. Если самое большое время, которое вам нужно сохранить, равно 23:59 = 23 * 60 + 59 = 1439 = количество минут в день, начиная с минуты 0, малый тон является наименьшим интегральным типом, который будет соответствовать этому диапазону.
Сопротивляйтесь соблазну хранить часы и минуты в отдельных столбцах как tinyints. Это будет использовать одно и то же пространство, как и один маленький интервал, но тогда каждый расчет времени потребует умножения часов на 60 и добавления минут, а для каждого order by
потребуются два столбца вместо одного.
Сохранить как минуты; на дисплее, вы можете разделить минуты на часы и минуты с помощью
select floor( absminutes / 60 ) as hours, absminutes % 60 as minutes,
from some table
order by absminutes;
Я бы назвал столбец minutes
или absminutes
(для абсолютных минут), если вы хотите отличить 1439 минут в день от 0-59 минут в час.
Чтобы преобразовать из значения базы данных в объект Timespan, используйте ctor Timespan(int, int, int)
, как этот new TimeSpan( floor(absminutes / 60 ), absminutes % 60, 0)
или (лучше) ctor Timespan(long)
с new Timespan( absminutes * TimeSpan.TicksPerMinute )
.
Чтобы вставить или обновить базу данных из объекта Timespan, установите absminutes на someTimespan.TotalMinutes % 1440
.
Ответ 3
Храните как varchar. Сохраните в sql с помощью TimeSpan.ToString()
. Читайте из sql как:
TimeSpanObj = TimeSpan.Parse(fieldValue)
Ответ 4
В настоящее время я рассматриваю возможность использования SQL-времени для обработки, но он не будет работать в течение >= 24 часа.
Преимущества включают легко читаемые, легко используемые в SQL и в коде, но падение состоит в том, что у вас есть только небольшой промежуток времени для воспроизведения.
declare @delay table (DelayTime Time(3))
insert into @delay values ('00:10:00.000')
select getdate() as nowtime, getdate()+DelayTime as nowPlusTen from @delay
и
SqlDataReader dr = cmd.ExecuteReader();
DelayTime = (TimeSpan) dr["DelayTime"];