В частности, мне нужны только часы: минуты, но, скажем, у меня есть объект .NET TimeSpan, как мне сохранить его в базе данных SQL (CE)?
Как лучше всего представить промежуток времени в SQL Server CE?
Ответы (4)
Я бы рекомендовал использовать long для представления количества галочек< /а>. Это то, что TimeSpan использует в качестве внутреннего представления. Это позволяет легко восстановить объект с помощью Timespan.FromTicks(). и вывод в базу данных с использованием Timespan Свойство .Ticks. Наименьшей единицей времени в .NET является тик, равный 100 наносекундам.
Хранить как varchar. Сохраните в sql, используя TimeSpan.ToString()
. Читать из sql как:
TimeSpanObj = TimeSpan.Parse(fieldValue)
'00:02'
вместо 1200000000
- person Justin Morgan; 20.12.2012
SQL CE не имеет типа времени или определяемых пользователем типов, поэтому вы можете выбрать дату и время или целое число, представляющее минуты. Если наибольшее время, которое вам нужно сохранить, составляет 23:59 = 23 * 60 + 59 = 1439 = количество минут в сутках, начиная с минуты 0, smallint — это наименьший целочисленный тип, который будет соответствовать этому диапазону.
Не поддавайтесь искушению хранить часы и минуты в отдельных столбцах как tinyints. Для этого потребуется то же пространство, что и для одного smallint, но тогда каждый расчет времени потребует умножения часов на 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, установите для абсминуты значение someTimespan.TotalMinutes % 1440
.
В настоящее время я рассматриваю возможность использования SQL Time для решения этой проблемы, но она не будет работать >= 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"];