Как лучше всего представить промежуток времени в SQL Server CE?

В частности, мне нужны только часы: минуты, но, скажем, у меня есть объект .NET TimeSpan, как мне сохранить его в базе данных SQL (CE)?


person Davy8    schedule 05.04.2009    source источник


Ответы (4)


Я бы рекомендовал использовать long для представления количества галочек< /а>. Это то, что TimeSpan использует в качестве внутреннего представления. Это позволяет легко восстановить объект с помощью Timespan.FromTicks(). и вывод в базу данных с использованием Timespan Свойство .Ticks. Наименьшей единицей времени в .NET является тик, равный 100 наносекундам.

person Bob King    schedule 13.04.2009
comment
Это именно то, что я делаю в проекте, над которым работаю. Затем слой ORM выполняет преобразование, как вы сказали, между TimeSpan и тиками, туда и обратно, без права на ошибку. Кроме того, дополнительным бонусом является то, что у вас есть вся точность, которая вам, вероятно, когда-либо понадобится. Если вы будете придерживаться минут, у вас возникнут настоящие проблемы, если вам скажет отдел маркетинга. Насколько сложно будет добиться точности до секунд? - person Edward Robertson; 09.12.2009
comment
Хорошо, но гарантированно ли один тик занимает ровно 100 наносекунд? - person SepehrM; 21.07.2015
comment
В документации фреймворка нет места для маневра: msdn.microsoft.com/en-us/library/ - person Bob King; 21.07.2015

Хранить как varchar. Сохраните в sql, используя TimeSpan.ToString(). Читать из sql как:

TimeSpanObj = TimeSpan.Parse(fieldValue)
person Bubba    schedule 31.08.2010
comment
Почему за это проголосовали? Это законное предложение, и если вам нужно редактировать данные SQL напрямую, гораздо проще написать 2 минуты как '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.

person tpdi    schedule 05.04.2009

В настоящее время я рассматриваю возможность использования 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"];
person rugg    schedule 22.04.2015